【发布时间】:2016-07-17 06:02:35
【问题描述】:
所以我找到了这个关于我的问题的链接,但它适用于 c#
Create a PNG from an array of bytes
我有一个可变的 int 数字数组。 我称之为“pix[]” 现在它可以是从 3 到 256 的任意大小,以后可能会更大。
我现在要做的是将其转换为像素图像。 我仍然是一个noobin c++,所以请原谅。 我尝试下载一些使使用 libpng 更容易的库,但它们似乎不起作用(ubuntu,code::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 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 long。同时创建一个 3x3 图像。
fwrite(pix,1,18,imageFile); 会在这些像素中写入什么信息?如果剩余的值只有 0,那将是最好的。
*edit 没关系,我只会在数组末尾添加 0,直到它填满整个正方形......对不起
【问题讨论】:
-
如果只需要结果png文件,可以使用Qt框架。它包含适当的 QPixmap 类,该类具有有用的 loadFromData 方法。这是附加参考:doc.qt.io/qt-5/qpixmap.html#loadFromData。输出的png文件可以用save方法保存(doc.qt.io/qt-5/qpixmap.html#save)
-
也许你应该解释“但他们似乎没有工作”,因为他们真的应该这样做。 (“他们”是谁?)
-
但 codeblocks 无法识别该库,即使我正确安装了 libpng 和 pngwriter 目录