Я использую следующий код, чтобы заблокировать прямоугольник область растрового изображенияКопирование rectangluar часть растрового изображения с использованием LockBits
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
.
Edit: Я 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);
, но это было очень медленно, когда я не сделал flip Y
(30 секунд)
Изображение размер б/у был 60000x1500
.
Без [хороший, _minimal_, _complete_ примера кода] (HTTP://stackoverflow.com/help/mcve), который надежно воспроизводит проблему, ответить на нее невозможно. Тем не менее, 'LockBits()' не может магически переформатировать данные за вашим растровым изображением, поэтому я не вижу причин ожидать, что работает '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. Вероятно, вам придется скопировать строку сканирования данных с помощью scanline; вы проверили свойство BitmapData.Stride? Он должен сказать вам, что вам нужно добавить в 'Scan0' для каждой следующей строки. –
@PeterDuniho Я понимаю, почему memcpy не будет работать. Значит, вы подразумеваете, что копирование scanline с помощью scanline - единственный способ сделать это? Можете ли вы объяснить, почему Bitmap.Clone принимает разные времена в этих двух случаях? – Dinesh
Есть ли причина, по которой не используется DrawImage? – TaW