首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LockBits复制位图的矩形部分

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

Stack Overflow用户
提问于 2015-04-21 08:35:28
回答 1查看 2.6K关注 0票数 5

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

代码语言:javascript
复制
Recangle rect = new rect(X,Y,width,height);
BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.ReadOnly,
                        bitmap.PixelFormat);

问题似乎是bitmapData.Scan0给了我矩形左上角的IntPtr。当我使用memcpy时,它将内存中的连续区域复制到指定的长度。

代码语言:javascript
复制
memcpy(bitmapdest.Scan0, bitmapData.Scan0, 
             new UIntPtr((uint (rect.Width*rect.Height*3)));

如果以下是我的位图数据,

代码语言:javascript
复制
a b c d e
f g h i j
k l m n o
p q r s t

如果矩形是(2, 1, 3 ,3),即区域

代码语言:javascript
复制
g h i
l m n
q r s

使用memcpy给出具有以下区域的位图

代码语言:javascript
复制
g h i
j k l
m n o

我能理解为什么它复制连续的记忆区域。底线是我想要使用Lockbits复制一个矩形区域。

编辑:我用了Bitmap.Clone

代码语言:javascript
复制
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)时,速度更快了。

代码语言:javascript
复制
bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);

但是当我没有翻转Y (30秒)时,速度非常慢。

所使用的图像大小为60000x1500

EN

回答 1

Stack Overflow用户

发布于 2015-05-05 20:44:48

别真的明白你的问题是什么。以下代码将正确的位图区域复制到托管数组中(当然,对于24 255位图,alpha总是255):

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29766955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档