我正在尝试使用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上。可能会出现“偏执”问题吗?
答案 0 :(得分:1)
在评论中回答了问题。 我不得不更换: 整数数据[] 创建人: 未签名的char数据[];
答案 1 :(得分:0)
================这部分不准确。请在下面查看我的解决方案部分====
int数据[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));
您将得到想要的东西。 最后一个参数,我相信这是大步向前。如果是这样,则步幅表示两行之间的偏移量。根据您的问题,我假设您有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);
}