Создать 8-битное растровое изображение из массива - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь создать растровое изображение из массива пикселей.

            var height = 2;
            var width = 2;
            var output = new byte[4] { 0, 0, 0, 0 };
            var gcHandle = GCHandle.Alloc(output, GCHandleType.Pinned);

            var stride = width * sizeof(byte);
            var pointer = gcHandle.AddrOfPinnedObject();
            using (var bitmap = new Bitmap(width, height, stride, PixelFormat.Format8bppIndexed, pointer))
            {
            }

Однако я получаю System.ArgumentException: 'Parameter is not valid.', без каких-либо внутренних исключений или дополнительных подробностей.

У меня нетхочу использовать SetPixel, потому что мой реальный массив очень большой.

Это использует библиотеку System.Drawing.Common 4.5.0 для .Net Standard 2.0

1 Ответ

0 голосов
/ 21 сентября 2018

Возможно, вы могли бы сделать что-то подобное, хотя я не уверен, будет ли это работать

unsafe public static void Main()
{
   var height = 2;
   var width = 2;
   var output = new byte[4] { 1, 2, 3, 4};
   using (var bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed))
   {
      var data = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);
      Marshal.Copy(data.Scan0, output, 0, 4);
      bitmap.UnlockBits(data);
      bitmap.Save(@"D:\blah.bmp");
   }
}

Метод Bitmap.LockBits

Bitmap.LockBitsМетод

Блокирует растровое изображение в системной памяти.

Marshal.Copy Метод

Копирует данные из управляемого массива вуказатель неуправляемой памяти или указатель неуправляемой памяти на управляемый массив.


Как уже отмечалось, просто работайте в 32bpp и упростите свою жизнь

public static void Main()
{
   var height = 2;
   var width = 2;
   var c = Color.White.ToArgb();
   var output = new int[4] { c, c, c, c };
   using (var bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed))
   {
      var data = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb);

      Marshal.Copy(output, 0, data.Scan0, 4);
      bitmap.UnlockBits(data);
      bitmap.Save(@"D:\trdy.bmp");
   }
}
...