Я написал программу, которая использует 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()
? Спасибо!