我有一个大的(> 100MB)位图,我需要同时从多个线程写入。每个帖子在他要写的图像中都有自己的区域。
我最初的想法是将每个线程交给Bitmap.LockBits返回的BitmapData,每个线程使用不同的矩形。但是,这会抛出一个" System.InvalidOperationException:Bitmap区域已被锁定。",即使没有重叠区域。
一个小代码示例,单线程但它证明了我的观点:
{
Bitmap bmp = new Bitmap(16, 8, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
var data1 = bmp.LockBits(new System.Drawing.Rectangle(0, 0, 8, 8), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
var data2 = bmp.LockBits(new System.Drawing.Rectangle(8, 0, 8, 8), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb); // throws
}
在此代码示例中,最后一个语句抛出异常。除非我的计数已关闭,否则两个矩形都应包含在原始位图中,并且不应重叠。
我应该使用一个LockBits锁定整个图像,然后写入该BitmapData而不用担心线程安全吗?我使用Marshal.Copy()将数据复制到Bitmap中。