1

我正在尝试使用 stb_image_write 将一个简单的图像文件写入磁盘。我使用最简单的测试用例:128 x 128 像素的 RGB 图像。

我在网上找到了这个例子,那个家伙似乎说它工作得很好,而且它看起来和我写了 2 个小时的完全一样:

void save_image(int w, int h, int channels_num)
{

    int data[w * h * channels_num];

     int index = 0;
     for (int j = h - 1; j >= 0; --j)
     {
      for (int i = 0; i < w; ++i)
      {
       float r = (float)i / (float)w;
       float g = (float)j / (float)h;
       float b = 0.2f;
       int ir = int(255.0 * r);
       int ig = int(255.0 * g);
       int ib = int(255.0 * b);

       data[index++] = ir;
       data[index++] = ig;
       data[index++] = ib;
      }
     }

    stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, 100);
}

save_image(128, 128, 3);

结果应该是一个漂亮的颜色渐变,但我能得到的只是一个带有一些垂直红、绿、蓝和黑线的有效文件。图像的尺寸还可以。我真的在这里找不到解决方案。我在 linux Jessie 上。可能存在“字节顺序”问题或类似的问题吗?

4

2 回答 2

2

这个问题在评论中得到了回答。我不得不将:int data[] 替换为:unsigned char data[];

于 2019-05-08T11:40:41.810 回答
1

=============== 这部分不准确。请在下面查看我的解决方案部分====

整数数据[w * h * channels_num];没关系,这不是你失败的原因。

更改此行

stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, 100);

stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, w * sizeof(int));

你会得到你想要的。最后一个参数,我相信是stride。如果是这样,stride 表示两条线之间的偏移量。根据您的问题,我假设您有 128 X 128 X 32 位颜色。那么步幅将是 w * sizeof(int)。

如果不是,请告诉我。

抱歉,我急着赶去开会。

============这部分是解决部分====

是的,

int data[w * h * channels_num]; 

应该

unsigned char data[w * h * channels_num];

加,

stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, 100);

应该改为

stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, w * channels_num);

完整的解决方案

void save_image(int w, int h, int channels_num)
{
    unsigned char data[w * h * channels_num];

    int index = 0;
    for (int j = h - 1; j >= 0; --j)
    {
        for (int i = 0; i < w; ++i)
        {
            data[index++] = (unsigned char)(255.0 * i / w);
            data[index++] = (unsigned char)(255.0 * j / h);
            data[index++] = (unsigned char)(255.0 * 0.2);
        }
    }

    stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, w * channels_num);
}
于 2019-05-08T11:23:32.580 回答