You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:09:03