使用LockBits复制位图的矩形部分

时间:2015-04-21 08:35:29

标签: c# .net winforms

我正在使用以下代码来锁定位图的矩形区域

Recangle rect = new rect(X,Y,width,height);
BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadOnly,
                        bitmap.PixelFormat);

问题似乎是bitmapData.Scan0给了我{1}}矩形的左上角。当我使用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); (30秒)

时,它非常慢

使用的图片尺寸为Y

1 个答案:

答案 0 :(得分:0)

不能真正解决你的问题。以下代码将正确的位图区域复制到托管数组中(我使用32bpp,当然,对于24bpp位图,alpha总是255):

int x = 1;
int y = 1;
int w = 2;
int h = 2;

Bitmap bmp = new Bitmap(@"path\to\bitmap.bmp");

Rectangle rect = new Rectangle(x, y, w, h);
System.Drawing.Imaging.BitmapData bmpData =
    bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly,
    System.Drawing.Imaging.PixelFormat.Format32bppArgb);

IntPtr ptr = bmpData.Scan0;

int bytes = 4 * w * h;
byte[] rgbValues = new byte[bytes];

System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);

bmp.UnlockBits(bmpData);