在c#中将RGB数组转换为图像

本文关键字:转换 图像 数组 RGB 中将 | 更新日期: 2023-09-27 18:02:46

我知道每个像素的rgb值,我如何在c#中通过这些值创建图片?我看到过这样的例子:

public Bitmap GetDataPicture(int w, int h, byte[] data)
  {
  Bitmap pic = new Bitmap(this.width, this.height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
  Color c;
  for (int i = 0; i < data.length; i++)
  {
    c = Color.FromArgb(data[i]);
    pic.SetPixel(i%w, i/w, c);
  }
  return pic;
  } 

但是它不起作用。我有一个像这样的二维数组:

1 3 1 2 4 1 3…
2 3 4 2 4 1 3…
……
……

每个数字对应一个rgb值,例如:1 => {244,166,89}2 => {68125} .

在c#中将RGB数组转换为图像

我会尝试下面的代码,它使用256个Color条目的数组作为调色板(您必须提前创建并填充它):

public Bitmap GetDataPicture(int w, int h, byte[] data)
{
    Bitmap pic = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
    for (int x = 0; x < w; x++)
    {
        for (int y = 0; y < h; y++)
        {
            int arrayIndex = y * w + x;
            Color c = Color.FromArgb(
               data[arrayIndex],
               data[arrayIndex + 1],
               data[arrayIndex + 2],
               data[arrayIndex + 3]
            );
            pic.SetPixel(x, y, c);
        }
    }
    return pic;
} 

我倾向于遍历像素,而不是数组,因为我发现读取双循环比读取单循环和取模/除操作更容易。

您的解决方案非常接近工作代码。你只需要"调色板"-即3个元素字节数组的集合,其中每个3个字节的元素包含{R, G, B}值。

    //palette is a 256x3 table
    public static Bitmap GetPictureFromData(int w, int h, byte[] data, byte[][] palette)
    {
      Bitmap pic = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
      Color c;
      for (int i = 0; i < data.Length; i++)
      {
          byte[] color_bytes = palette[data[i]];
          c = Color.FromArgb(color_bytes[0], color_bytes[1], color_bytes[2]);
          pic.SetPixel(i % w, i / w, c);
      }
      return pic;
    }

这段代码可以为我工作,但是它很慢。

如果你在内存中创建BMP-file的"image",然后使用image . fromstream (MemoryStream("image")),它的代码会更快,但它更复杂的解决方案