Подтвердить что ты не робот

С# Эффективное получение пиксельных данных из System.Drawing.Bitmap

У меня есть несколько (~ 2 ГБ) необработанных RGB файлов 24bpp на HDD. Теперь я хочу получить часть его и масштабировать до нужного размера.
(Разрешены только допустимые размеры: 1, 1/2, 1/4, 1/8,..., 1/256)

Итак, я сейчас читаю каждую строку из прямоугольника интереса в массив, который оставляет меня с растровым изображением, которое имеет правильную высоту, но неправильную ширину.

В качестве следующего шага я создаю Bitmap из вновь созданного массива.
Это делается с помощью указателя, чтобы не было копирования данных. Затем я вызываю GetThumbnailImage в Bitmap, который создает новое растровое изображение с правильными размерами.

Теперь я хочу вернуть необработанные пиксельные данные (как байтовый массив) вновь созданного растрового изображения. Но для этого я в настоящее время копирую данные с помощью LockBits в новый массив.

Итак, мой вопрос: Есть ли способ получить пиксельные данные из Bitmap в массив байтов без копирования?

Что-то вроде:

var bitmapData = scaledBitmap.LockBits(...)
byte[] rawBitmapData = (byte[])bitmapData.Scan0.ToPointer()
scaledBitmap.UnlockBits(bitmapData)
return rawBitmapData 

Я хорошо знаю, что это не работает, это просто пример того, чего я в основном хочу достичь.

4b9b3361

Ответ 1

Я думаю, что это ваш лучший выбор.

var bitmapData = scaledBitmap.LockBits(...);
var length = bitmapData.Stride * bitmapData.Height;

byte[] bytes = new byte[length];

// Copy bitmap to byte[]
Marshal.Copy(bitmapData.Scan0, bytes, 0, length);
scaledBitmap.UnlockBits(bitmapData);

Вам нужно скопировать его, если вы хотите пройти по байту [].

Вам не нужно удалять выделенные байты, вам просто нужно удалить исходный объект Bitmap, когда он будет выполнен, поскольку он реализует IDisposable.