STB图像写问题

stb image write issue

本文关键字:问题 图像 STB      更新时间:2023-10-16

我正在尝试使用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上。是否存在" endianess"问题或类似的问题?

评论中回答了这个问题。我必须替换: int数据[]经过 : 未签名的char数据[];

============================请在下面查看我的解决方案部分====

int数据[w * h * channels_num];可以,这不是您失败的原因。

更改此行

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

to

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

您会得到想要的东西。最后一个参数,我相信这是大步向前。如果是这样,则大步表示两行之间的偏移。根据您的问题,我认为您有128 x 128 x 32位颜色。然后大步将是w * sizeof(int(。

如果没有,请告诉我。

对不起,我急着赶上开会。

===============该部分是解决方案part ========

是,

int data[w * h * channels_num]; 

应该是

unsigned char data[w * h * channels_num];

plus,

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);
}