gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:58:26 27 4
gpt4 key购买 nike

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

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

最佳答案

不明白你的问题是什么。下面的代码将正确的位图区域复制到托管数组中(我使用 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);

关于c# - 使用 LockBits 复制位图的矩形部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29766955/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com