我想将一个图像的alpha通道与其他图像进行比较。我的比较方法是这样的:我可以将图像处理与PLINQ并行吗?
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
byte* aRow = (byte *)aData.Scan0 + (y * aData.Stride);
byte* bRow = (byte *)bData.Scan0 + (y * bData.Stride);
for (int x=0; 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 :0
at System.Drawing.Bitmap.LockBits (Rectangle rect, ImageLockMode flags, PixelFormat format, System.Drawing.Imaging.BitmapData bitmapData) [0x00000] in :0
我知道gdiplus必须在不同的进程中执行,但我认为PLINQ正在这样做。我的假设有什么问题?
2012-06-28
Rodja
+0
PLINQ不使用不同的工艺来执行。它使用线程。 –