У меня есть метод для копирования Bitmap
в массив byte
с использованием Marshal.Copy
:
public byte[][] PrepareTestSamples(Bitmap bitmap, int imageCount, out BitmapData bitmapData)
{
bitmapData = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadWrite,
bitmap.PixelFormat);
int pixelsCount = bitmapData.Stride * bitmap.Height;
byte[][] images = new byte[imageCount * 3][];
for (int i = 0; i < imageCount * 3; i++)
{
images[i] = new byte[pixelsCount];
Marshal.Copy(bitmapData.Scan0, images[i], 0, pixelsCount);
}
return images;
}
И этот код работает отлично. Я могу скопировать изображение в байтовые массивы imageCount * 3
раз.
Затем я использую эти массивы для проверки моих алгоритмов. Определение любого алгоритма выглядит следующим образом:
byte[] Execute(byte[] pixels, int stride, int height, int width);
После выполнения алгоритма я возвращаю новый byte[]
с измененными пикселями. Затем я снова копирую его в новый Bitmap
, используя Lockbits
.
var bmp = new Bitmap(bitmap.Width, bitmap.Height);
BitmapData bmpData = bmp.LockBits(
new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadWrite,
bitmap.PixelFormat);
Marshal.Copy(images[1], 0, bmpData.Scan0, images[1].Length);
bmp.UnlockBits(bmpData);
Я хочу протестировать свою программу, используя pointers
. Я хочу проверить это, если указатели в этом случае будут быстрее, чем управляемая память.
Я думаю, что определение любого алгоритма должно быть изменено на:
byte[] Execute(byte* pixels, int stride, int height, int width);
Но у меня есть вопрос, как скопировать BitmapData
в нечто вроде массива указателей? Как сохранить imagesCount * 3
изображения в виде указателей и передать pointer
методу один за другим?