我使用以下代码来锁定位图的矩形区域:
如果以下是我的位图数据:
使用
Recangle rect = new rect(X,Y,width,height);
BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadOnly,
bitmap.PixelFormat);
问题似乎在于bitmapData.Scan0
给我提供了矩形左上角的IntPtr
。当我使用memcpy
时,它复制了内存中指定长度的连续区域。
memcpy(bitmapdest.Scan0, bitmapData.Scan0,
new UIntPtr((uint (rect.Width*rect.Height*3)));
如果以下是我的位图数据:
a b c d e
f g h i j
k l m n o
p q r s t
如果矩形是 (2, 1, 3, 3)
,即该区域
g h i
l m n
q r s
使用
memcpy
会给我一个带有以下区域的位图。g h i
j k l
m n o
我理解为什么它会复制连续的内存区域。底线是我想使用Lockbits
来复制一个矩形区域。
编辑:
我使用了Bitmap.Clone
,
using (Bitmap bitmap= (Bitmap)Image.FromFile(@"Data\Edge.bmp"))
{
bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
Rectangle cropRect = new Rectangle(new Point(i * croppedWidth, 0),new Size(croppedWidth, _original.Height));
_croppedBitmap= bitmap.Clone(cropRect, bitmap.PixelFormat);
}
但是当我翻转了Y
时,速度更快(少于500ms
)
bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
当我没有翻转Y
轴时,它的速度非常慢(30秒)。
使用的图像大小为60000x1500
。
LockBits()
不能神奇地重新格式化你的位图后面的数据,因此我不认为直接使用memcpy()
可行。你可能需要逐行复制数据;你检查过BitmapData.Stride
属性了吗?它应该告诉你每一行需要添加到Scan0
上的内容。 - Peter Duniho