Я искал самый быстрый способ конвертировать растровое изображение в 8bpp.
Я нашел 2 способа:
1.
public static System.Drawing.Image ConvertTo8bpp(Bitmap oldbmp)
{
using (var ms = new MemoryStream())
{
oldbmp.Save(ms, ImageFormat.Gif);
ms.Position = 0;
return System.Drawing.Image.FromStream(ms);
}
}
2. http://www.wischik.com/lu/programmer/1bpp.html
Но:
1. Результат очень низкого качества (плохой поддон)
и 2 дает мне Битовое изображение с отрицательным шагом, когда я пытаюсь блокировать биты и копировать данные в байтовый массив, я получаю исключение: Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
this.stride = bmpData.Stride;
this.bytesPerPixel = GetBytesPerPixel(bmp.PixelFormat);
int length = bmpData.Stride * bmp.Height;
if (this.stride < 0)
this.data = new byte[-length];
else
this.data = new byte[length];
Marshal.Copy(bmpData.Scan0, data, 0, length);
//Unlock the bitmap
bmp.UnlockBits(bmpData);
Как я могу сделать 2 дает положительный шаг? Или как я могу скопировать данные, используя блокировку отрицательного шага ??