所以我找到了这个关于我的问题的链接,但它适用于 c#
我有一个可变的 int 数字数组。我将它称为“pix[]”,现在它可以是从 3 到 256 的任何大小,以后可能更大。
我现在要做的是将其转换为像素图像。我仍然是一个noobin c++,所以请原谅。我尝试下载一些使使用 libpng 更容易的库,但它们似乎不起作用(ubuntu,code::blocks)所以我有以下问题:
1)你如何创建一个新的位图(哪些库,哪个命令)?
- 我如何用“pix[]”中的信息填充它?
3)我如何保存它?
如果它是一个问题的转贴,我也对链接感到高兴;)
这是我到目前为止的工作,感谢您的帮助。
int main(){
FILE *imageFile;
int x,y,pixel,height=2,width=3;
imageFile=fopen("image.pgm","wb");
if(imageFile==NULL){
perror("ERROR: Cannot open output file");
exit(EXIT_FAILURE);
}
fprintf(imageFile,"P3\n"); // P3 filetype
fprintf(imageFile,"%d %d\n",width,height); // dimensions
fprintf(imageFile,"255\n"); // Max pixel
int pix[100] {200,200,200, 100,100,100, 0,0,0, 255,0,0, 0,255,0, 0,0,255};
fwrite(pix,1,18,imageFile);
fclose(imageFile);
}
我还没有完全理解它的作用。我可以打开输出图像,但它不是数组的正确表示。
如果我改变一些东西,例如制作一个二维数组,那么图像查看器会告诉我“预期为整数”并且不会显示图像。
到目前为止,一切都很好。因为我在图像之前有数组,所以我创建了一个函数 aufrunden
向上舍入到下一个整数,因为我想创建一个方形图像。
int aufrunden (double h)
{
int i =h;
if (h-i == 0)
{
return i;
}
else
{
i = h+1;
return i;
}
}
此函数用于创建图像。如果图像大于数组提供的信息,如下所示( a
是数组的长度)
double h;
h= sqrt(a/3.0);
int i = aufrunden(h);
FILE *imageFile;
int height=i,width=i;
现在可能会发生,该数组是 a=24
长。 aufrunden
使图像为 3x3,因此它有 27 个值…意味着它缺少 1 个像素的值。或更糟糕的是,它只有 a=23
长。还创建一个 3x3 图像。
fwrite(pix,1,18,imageFile);
会在这些像素中写入什么信息?如果剩余的值只是 0,那将是最好的。
*编辑没关系,我只会在数组的末尾添加 0 直到它填满整个正方形……对不起
原文由 busssard 发布,翻译遵循 CC BY-SA 4.0 许可协议
下面的代码将像素颜色的整数数组作为输入,并将其写入
.bmp
位图文件,或者相反,读取.bmp
位图文件并将其图像内容存储为int
数组。它只需要<fstream>
库。 The input parameterpath
can be for exampleC:/path/to/your/image.bmp
anddata
is formatted asdata[x+y*width]=(red<<16)|(green<<8)|blue;
, wherebyred
,green
和blue
是0-255
范围内的整数,像素位置是(x,y)
。代码片段的灵感来自 https://stackoverflow.com/a/47785639/9178992
对于
.png
图像,使用 lodepng.cpp 和 lodepng.h :