Magic.NETのGetPixelsを使うとメモリリークする?
.NET Frameworkで「ImageMagck」を使う際に使う「Magic.NET」ですが、読み込んだ画像のピクセル毎の色情報を使いたい時にImageMagick.MagickImage.GetPixels()関数を使うのですが使い方を間違えるとメモリリークします。
このコードは7.0.5.502で確認しました。
問題のコード
//using ImageMagick; MagickImage Image = new MagickImage("example.bmp");// 適当な初期化処理
using (var Pixels= Image.GetPixels()) {
Pixels.AsParallel().ForAll((pixel) =>
{
var color = pixel.ToColor();
// 色々な処理
});
}
この場合、メモリリークが起きてしまいます。
対策したコード
//using ImageMagick;
MagickImage Image = new MagickImage("example.bmp");// 適当な初期化処理
using (var Pixels= Image.GetPixels())
{
Pixels.AsParallel().ForAll((pixel) =>{
var color = pixel.ToColor();
// 色々な処理
color.Clone();// Closeしないといけない
});
}
つまりToColor()で取得したMagicColorをCloseしないといけない訳です。
IDisposableが実装されていないので見落としてましたが、ネイティブライブラリのラッパー故かGCで面倒を見てくれないので注意が必要。