1

我编写了一个依赖于 Magick++ 的程序,仅用于导入和导出各种图像格式。它使用 Image.getPixels() 获取 PixelPacket,进行大量矩阵转换,然后在写入新图像之前调用 Image.syncPixels()。一般方法与Magick++ 文档中显示的示例相同。或多或少,相关代码是:

Magick::Image image("image01.bmp");
image.modifyImage();
Magick::PixelPacket *imagePixels = image.getPixels(0, 0, 10, 10);
// Matrix manipulation occurs here.
// All actual changes to the PixelPacket direct changes to pixels like so:
imagePixels[i].red = 4; // or any other integer
// finally, after matrix manipulation is done
image.syncPixels();
image.write("image01_transformed.bmp");

当我运行上面的代码时,新的图像文件(本例中为“image01_transformed.bmp”)最终与原始图像文件相同。但是,如果我将其写入不同的格式,例如“image01_transformed.ppm”,我会得到正确的结果:修改后的图像。我认为这是由于格式编码图像的缓存版本,并且 Magick++ 出于某种原因不知道图像实际上已更改,因此缓存已过时。image.blur(1.0, 0.1);我通过在前面添加来测试这个想法image.syncPixels();,并且强制这种无关紧要的更改确实会导致相同格式图像的正确结果。

有没有办法强制 Magick++ 意识到缓存已过时?我是不是一开始就用getPixels()syncPixels()了?谢谢!

4

0 回答 0