さまざまな画像形式のインポートとエクスポートを行うだけの 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()
and を間違って使用していますか? syncPixels()
ありがとう!