ある画像のアルファ チャネルを他の 1000 までの画像と比較したい。私の比較方法は次のようになります。
public static unsafe double Similiarity (Bitmap a, Bitmap b)
{
BitmapData aData = a.LockBits (
new Rectangle (0, 0, a.Width, a.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly, a.PixelFormat);
BitmapData bData = b.LockBits (
new Rectangle (0, 0, b.Width, b.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly, b.PixelFormat);
int PixelSize = 4;
double sum = 0;
for (int y=0; y<aData.Height; y++) {
byte* aRow = (byte *)aData.Scan0 + (y * aData.Stride);
byte* bRow = (byte *)bData.Scan0 + (y * bData.Stride);
for (int x=0; x<aData.Width; x++) {
byte aWeight = aRow [x * PixelSize + 3];
byte bWeight = bRow [x * PixelSize + 3];
sum += Math.Abs (aWeight - bWeight);
}
}
a.UnlockBits (aData);
b.UnlockBits (bData);
return 1 - ((sum / 255) / (a.Width * a.Height));
}
計算を高速化する最も簡単な方法は、PLINQ を使用することだと思いました。
var list = from Bitmap img in imageList.AsParallel where (Similiarity (referenceImage, img) > 0.5) select img;
しかし、実行時にgdiplusに例外があります:
System.InvalidOperationException: The operation is invalid [GDI+ status: Win32Error]
at System.Drawing.GDIPlus.CheckStatus (Status status) [0x00000] in <filename unknown>:0
at System.Drawing.Bitmap.LockBits (Rectangle rect, ImageLockMode flags, PixelFormat format, System.Drawing.Imaging.BitmapData bitmapData) [0x00000] in <filename unknown>:0
gdiplus は別のプロセスで実行する必要があることは理解していますが、PLINQ はそうしていると思いました。私の仮定の何が間違っていますか?