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

时间:2016-08-17 06:46:13

标签: c# image bitmap

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

CKEDITOR.replace( 'YourEditor', 
{ 
 on:
   {
     instanceReady : function( evt )
     {
       //Set the focus to your editor
       CKEDITOR.instances.YourEditor.focus();
      }
    }
}

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

  

1 3 1 2 4 1 3 ...
2 3 4 2 4 1 3 ...
4 3 1 2 4 1 3 ...
...

每个数字对应于rgb值,例如,1 => {} 244,166,89 2 => {54,68,125}

2 个答案:

答案 0 :(得分:2)

我尝试使用以下代码,该代码使用调色板的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 = palette[arrayIndex];
            pic.SetPixel(x, y, c);
        }
    }

    return pic;
} 

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

答案 1 :(得分:0)

您的解决方案非常靠近工作代码。只需要“调色板” - 即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文件的内存“映像”然后使用Image.FromStream(MemoryStream(“image”)),它的代码将更快,但它更复杂的解决方案。