我遇到了GraphicsMagick的问题。我重新排列图像中的像素并尝试保存它,但生成的图像始终是相同的。如何在保存之前更新图像? 这是我的代码:
PixelPacket *write_pixels = SetImagePixelsEx(
image,
0, // x
0, // y
w, // columns
h, // rows
&exception
);
for (int y = 0; y < h; y++) {
printf("%hhu -> ", write_pixels[y * w].red);
printf("%hhu -> ", pixels[y][0].red);
for (int x = 0; x < w; x++) {
write_pixels[x + y * w] = pixels[y][x];
}
printf("%hhu\n", write_pixels[y * w].red);
}
SyncImagePixelsEx(image, &exception);
strcpy(image->filename, outfile);
if (!WriteImage(imageInfo, image)) {
CatchException(&image->exception);
return 1;
}
我打印一些输出以确保它正常工作。以下是一些输出:
81 -> 64 -> 64
68 -> 65 -> 65
84 -> 66 -> 66
80 -> 67 -> 67
64 -> 68 -> 68
93 -> 69 -> 69
86 -> 70 -> 70
91 -> 71 -> 71
107 -> 72 -> 72
85 -> 73 -> 73
111 -> 74 -> 74
102 -> 75 -> 75
所以我知道像素正在改变。并且docs说我需要更新像素的是SyncImagePixelsEx()
,我使用了它。保存时为什么不更新图像?
我已检查过所有内容,但每次保存到新文件名的图像看起来都与原始图像完全相同。
答案 0 :(得分:0)
经过几个小时的挫折,我终于遇到了一个解决方案。使用像素数据创建新图像有效:
Image *new_image;
new_image = ConstituteImage(
image->columns, // width
image->rows, // height
"RGBO", // order of pixel array
CharPixel, // type
write_pixels, // pixels
&exception
);
strcpy(new_image->filename, outfile);
if (!WriteImage(image_info, new_image)) {
CatchException(&new_image->exception);
return 1;
}