所以我找到了关于我的问题的链接,但这是针对C#的
Create a PNG from an array of bytes
我有一个可变的整数数组。
我将其称为“pix []”
目前,它可以是3到256之间的任何大小,以后可能更大。
我现在要做的是将其转换为像素图像。
我仍然是一个noobin c++,所以请原谅。
我试图下载一些使使用libpng更加容易的库,但是它们似乎不起作用(ubuntu,代码:: blocks)
所以我有以下问题:
1)如何创建一个新的位图(哪个库,哪个命令)?
2)如何用“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数,因为我想创建一个正方形图像。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);
将在这些像素中写入哪些信息以供引用?如果remaing值仅为0,那将是最好的。*编辑没关系,我只会在数组的末尾添加0,直到它填满整个正方形为止...抱歉
最佳答案
考虑使用Netpbm格式(pbm,pgm或ppm)。
这些图像是非常简单的文本文件,无需任何特殊库即可编写。然后使用某些第三方软件(例如ImageMagick,GraphicsMagick或pnmtopng)将您的图像转换为PNG格式。这是描述Netpbm format的Wiki文章。
这是一个简单的PPM图片:
P3 2 3 255
0 0 0 255 255 255
255 0 0 0 255 255
100 100 100 200 200 200
第一行包含“P3”(将其标识为文本PPM的“魔数(Magic Number)”),2(宽度),3(高度),255(最大强度)。
第二行包含第一行的两个RGB像素。
第三行和第四行分别包含第2行和第3行的两个RGB像素。
如果您需要更大范围的强度(最大65535),请使用更大的数字表示最大强度(例如1024)。
马克·谢切尔(Mark Setchell)所编辑的内容超出了这一点-我是有罪的聚会!
图像看起来像这样(当六个像素放大时):
用于转换和放大的ImageMagick命令是这样的:
convert image.ppm -scale 400x result.png
如果ImageMagick有点笨重,或者难以安装,则可以更简单地使用NetPBM工具(来自here),就像这样(它是一个预编译的二进制文件)
pnmtopng image.ppm > result.png