我正在尝试读取图像文件并通过将每个字节乘以一个绝对因子的像素级别来缩放它。我不确定我做得对,但是 -
void scale_file(char *infile, char *outfile, float scale)
{
// open files for reading
FILE *infile_p = fopen(infile, 'r');
FILE *outfile_p = fopen(outfile, 'w');
// init data holders
char *data;
char *scaled_data;
// read each byte, scale and write back
while ( fread(&data, 1, 1, infile_p) != EOF )
{
*scaled_data = (*data) * scale;
fwrite(&scaled_data, 1, 1, outfile);
}
// close files
fclose(infile_p);
fclose(outfile_p);
}
我得到的是如何进行每个字节乘法(比例为0-1.0浮点数) - 我很确定我要么读错了要么错过了一些大的东西。此外,假设数据是无符号的(0-255)。请不要判断我的糟糕代码:)
感谢
答案 0 :(得分:3)
char *data;
char *scaled_data;
没有为这些指针分配内存 - 为什么需要它们作为指针? unsigned char
变量就可以了(unsigned
,因为它对字节数据更有意义。)
此外,当比例超出256范围时,会发生什么?你想要饱和,包装还是什么?
答案 1 :(得分:2)
char *scaled_data;
更改为char scaled_data;
*scaled_data = (*data) * scale;
更改为scaled_data = (*data) * scale;
那会让你的代码可以做你想做的事,但是......
这可能只适用于您自己的自定义格式的图像文件。没有标准的图像格式只是按顺序转储文件中的像素。图像文件需要了解更多信息,例如
所有这些都称为元数据
另外(如#5所提到的),像素数据通常是压缩的。
答案 2 :(得分:2)
你的代码相当于说“我想通过将这些位分成两半来缩小我的图像”;它没有任何意义。
图像文件是带有标题和字段的复杂格式,以及需要解释的各种有趣的东西。听取nobugz的建议并查看ImageMagick。它是一个完全按照你想要的东西的库。
答案 3 :(得分:1)
为什么你认为你错了,我认为你的算法没有错,除非效率不高char *data;
和char *scaled_data;
应该是unsigned char data;
和unsigned char scaled_data;
答案 4 :(得分:1)
我对位图(仅原始数据)的理解是每个像素由三个数字表示,每个数字用于RGB;将每个乘以一个< = 1的数字只会使图像变暗。如果你试图使图像更宽,你可以只输出每个像素两次(加倍大小),或者只输出每隔一个像素(减小尺寸),但这取决于它的光栅化方式。