WinForm中将灰度图字节数组转Bitmap赋值给PictureBox报参数无效如何解决
错误原因
Bitmap(Stream, bool) 构造函数要求传入的流必须是带完整元信息的标准图像格式(如BMP、PNG、JPG等),你传入的是纯像素裸数据,没有宽高、位深、调色板等必要信息,因此无法解析,抛出参数无效错误。
8位灰度图正确实现代码
需要手动创建对应格式的Bitmap,配置灰度调色板后写入像素数据,示例代码如下:
using System.Drawing.Imaging; private void button1_Click(object sender, EventArgs e) { int w = 256; byte[] rawIm = new byte[w * w]; for(int i = 0; i < w; ++i) { for (int j = 0; j < w; ++j) { rawIm[i * w + j] = (byte)j; } } // 创建8位索引格式的Bitmap Bitmap bm = new Bitmap(w, w, PixelFormat.Format8bppIndexed); // 配置灰度调色板 ColorPalette palette = bm.Palette; for (int k = 0; k < 256; k++) { palette.Entries[k] = Color.FromArgb(k, k, k); } bm.Palette = palette; // 锁定像素区域写入数据 BitmapData bmpData = bm.LockBits(new Rectangle(0, 0, w, w), ImageLockMode.WriteOnly, bm.PixelFormat); IntPtr ptr = bmpData.Scan0; System.Runtime.InteropServices.Marshal.Copy(rawIm, 0, ptr, rawIm.Length); bm.UnlockBits(bmpData); pictureBox1.Image = bm; }
16位灰度图扩展方案
后续实现16位灰度图显示时,只需要调整以下几点即可:
- 将Bitmap的像素格式改为
PixelFormat.Format16bppGrayScale - 原始像素数组改为
ushort[]类型,每个元素对应0~65535范围的灰度值 - 数据拷贝时总长度改为
w * w * 2,默认适配系统小端字节序,不需要额外转换即可正常显示
内容的提问来源于stack exchange,提问作者Tirsa
相关产品推荐
相关产品推荐

