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)。