我正在使用以下代码来锁定位图的矩形区域
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
。
答案 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);