一种在P2格式下写入pgm文件数据的方法

pgm文档是一种可移植灰度图像,它有P2和P5两种格式,今天给大家分享一种在P2格式下写入数据的方法。

int write(FILE *outputFile, pgmImage *pgm)
{
    /* write magic number, size & gray value */
    size_t nBytesWritten = fprintf(outputFile, "P2\n%d %d\n%d\n", (*pgm).width, (*pgm).height, (*pgm).maxGray);

    /* check that dimensions wrote correctly */
    if (nBytesWritten < 0)
    {
        /* failed size sanity check    */
        /* free up the memory          */
        free_pgm(pgm);
        /* return error code */
        return ERROR_OUTPUT_FAILED;
    } /* dimensional write failed */

    /* pointer for efficient write code */
    for (unsigned char *nextGrayValue = (*pgm).imageData; nextGrayValue < (*pgm).imageData + (*pgm).nImageBytes; nextGrayValue++)
    {
        /* per gray value         */
        /* get next char's column */
        int nextCol = (nextGrayValue - (*pgm).imageData + 1) % (*pgm).width;

        /* write the entry & whitespace */
        nBytesWritten = fprintf(outputFile, "%d%c", *nextGrayValue, (nextCol ? ' ' : '\n'));

        /* sanity check on write */
        if (nBytesWritten < 0)
        {
            /* failed size sanity check    */
            /* free up the memory          */
            free_pgm(pgm);
            /* return error code */
            return ERROR_OUTPUT_FAILED;
        } /* data write failed   */
    }     /* per gray value */

    return FUNCTION_SUCCESS;
}

这个函数的目的是将一个pgm图像(灰度图像)以ASCII(P2)格式写入一个输出文件中。这个函数接收三个参数:一个指向输出文件的指针(outputFile)、一个指向输入文件名的字符串指针(filename,虽然在这个函数中并未使用到),以及一个指向pgmImage结构体实例的指针(pgm)。

写入文件头信息:
size_t nBytesWritten = fprintf(outputFile, "P2\n%d %d\n%d\n", (*pgm).width, (*pgm).height, (*pgm).maxGray);
这一行将P2(表示ASCII灰度图像)作为魔数(magic number)写入文件,紧接着写入图像的宽度、高度和最大灰度值。这些信息都是文件头的一部分,用于描述图像的基本属性。

检查文件头信息是否正确写入:
通过检查nBytesWritten的值,如果为负数,说明在写入文件头信息时发生了错误。这种情况下,函数将释放pgmImage结构体实例的内存并返回一个错误代码(ERROR_OUTPUT_FAILED)。

逐行写入像素值:
接下来的循环遍历每个灰度值,并将其写入输出文件中。循环使用一个unsigned char指针(nextGrayValue)来遍历pgmImage结构体实例中的图像数据(imageData),直到遍历完所有字节(nImageBytes)。

获取当前灰度值所在的列:
int nextCol = (nextGrayValue - (*pgm).imageData + 1) % (*pgm).width;
这行代码计算当前灰度值所在的列。如果当前灰度值不是该行的最后一个像素,则在当前像素值之后添加一个空格;如果是该行的最后一个像素,则在当前像素值之后添加一个换行符。

写入当前灰度值和分隔符:
nBytesWritten = fprintf(outputFile, "%d%c", *nextGrayValue, (nextCol ? ' ' : '\n'));
这行代码将当前灰度值(*nextGrayValue)以及一个空格或换行符(取决于当前列是否为行末)写入输出文件。

检查写入操作是否成功:
同样地,通过检查nBytesWritten的值,如果为负数,说明在写入像素值时发生了错误。这种情况下,函数将释放pgmImage结构体实例的内存并返回一个错误代码(ERROR_OUTPUT_FAILED)。

返回函数成功执行的标识:
如果函数成功执行,没有遇到任何错误,那么在循环结束后返回一个表示成功的代码(FUNCTION_SUCCESS)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要读取pgm文件数据,可以使用以下方法之一: 方法一:使用Pillow库 1. 导入必要的库:from PIL import Image 2. 使用Image.open()函数打开pgm文件:im = Image.open(filepath) 3. 查看图片格式:print(im.mode) 4. 查看图片尺寸:print(im.size) 5. 可以使用im对象的其他方法来操作和处理pgm文件数据。例如,可以使用im.show()来显示图片。 方法二:使用numpy和matplotlib库 1. 导入必要的库:import numpy as np, matplotlib.pyplot as plt 2. 定义一个函数来读取pgm文件数据: def read_pgm(pgmf): assert pgmf.readline() == 'P5\n' (width, height) = [int(i) for i in pgmf.readline().split()] depth = int(pgmf.readline()) assert depth <= 255 raster = [] for y in range(height): row = [] for x in range(width): row.append(ord(pgmf.read(1))) raster.append(row) return raster 3. 调用read_pgm函数并传入pgm文件路径来读取数据:data = read_pgm(filepath) 4. 可以使用numpy和matplotlib绘图库来显示pgm文件数据。例如,使用plt.imshow(np.array(data))来显示数据。 请注意,根据不同的pgm文件格式,你可能需要根据具体情况调整代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [.pgm图片简介以及Python读取.pgm图片的方法](https://blog.csdn.net/quiet_girl/article/details/80904471)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [在python中读取.pgm格式图像](https://blog.csdn.net/l_z_z_z/article/details/120800683)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值