在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} .
我会尝试下面的代码,它使用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")),它的代码会更快,但它更复杂的解决方案