0

我正在尝试读取图像文件并通过将每个字节乘以其像素级别乘以某个绝对因子来缩放它。我不确定我做对了,不过-

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)。请不要评判我糟糕的代码:)

谢谢

4

5 回答 5

3
char *data;
char *scaled_data;

没有为这些指针分配内存 - 为什么需要它们作为指针?unsigned char变量会很好(unsigned因为它对字节数据更有意义)。

另外,当秤的数值超出 256 范围时会发生什么?你想要饱和,环绕,还是什么?

于 2010-03-06T15:46:13.727 回答
2
  1. 更改char *scaled_data;char scaled_data;
  2. 更改*scaled_data = (*data) * scale;scaled_data = (*data) * scale;

这会让你的代码可以做你想做的事情,但是....

这可能只适用于您自己的自定义格式的图像文件。没有标准的图像格式只是按顺序在文件中以字节为单位转储像素。图像文件需要了解更多信息,例如

  1. 图片的高度和宽度
  2. 如何表示像素(1 字节灰色、3 字节颜色等)
  3. 如果像素表示为调色板的索引,则它们具有调色板
  4. 各种其他信息(GPS 坐标、创建它的软件、创建日期等)
  5. 用于像素的压缩方法

所有这些都称为元数据

此外(正如#5 所提到的),像素数据通常被压缩。

于 2010-03-07T02:34:38.903 回答
2

你的代码相当于说“我想通过将位分成两半来缩小我的图像”;这没有任何意义。

图像文件是具有标题和字段的复杂格式以及需要解释的各种有趣的东西。接受 nobugz的建议并查看ImageMagick。它是一个完全可以做你想做的事情的库。

于 2010-03-07T02:59:53.117 回答
1

为什么你认为你错了,我认为你的算法没有任何问题,除了效率不高char *data;而且char *scaled_data;应该是unsigned char data;unsigned char scaled_data;

于 2010-03-06T16:05:27.830 回答
1

我对位图(只是原始数据)的理解是,每个像素由三个数字表示,每个数字代表 RGB;将每个乘以一个 <=1 只会使图像更暗。如果您试图使图像更宽,您可以只输出每个像素两次(使大小加倍),或者只输出每隔一个像素(使大小减半),但这取决于它的光栅化方式。

于 2010-03-06T19:31:10.097 回答