С# Эффективное получение пиксельных данных из 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
Я хорошо знаю, что это не работает, это просто пример того, чего я в основном хочу достичь.
Ответы
Ответ 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.