Я хочу получить необработанные данные цвета / пикселя из Bitmap
в следующем формате:
byte[] data = { A, R, G, B, A, R, G, B, A, R, G, B... };
, где A
, R
, G
и B
- это числа в диапазоне от 0на 255.
Я использую следующий фрагмент кода, чтобы сделать это:
public static byte[] GetPixelData(this Bitmap bmp)
{
var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
var bitmapData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
var length = bitmapData.Stride * bitmapData.Height;
byte[] bytes = new byte[length];
Marshal.Copy(bitmapData.Scan0, bytes, 0, length);
bmp.UnlockBits(bitmapData);
return bytes;
}
Это работает, однако это ужасно медленно, занимает около 30 секунд для одного4000x3000 JPEG.
Я немного обыскал и нашел только решения, которые включают Marshal.Copy
и / или Bitmap.LockBits
.
Есть ли более быстрый способ сделать это?
Редактировать : я попробовал класс DirectBitmap
из дублирующего вопроса, но он все еще очень, очень медленный.Разве нет лучшего решения?