从数组创建8位位图

时间:2018-09-21 08:12:11

标签: c# system.drawing

我正在尝试根据像素数组创建位图。

            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的{​​{1}}库

1 个答案:

答案 0 :(得分:1)

您可能会做类似的事情,尽管我不确定这是否行得通

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 Method

  

Bitmap.LockBits方法

将位图锁定到系统内存中。

Marshal.Copy Method

  

将数据从托管数组复制到非托管内存指针,或者   从非托管内存指针到托管数组。


如前所述,只需在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");
   }
}