You need to enable JavaScript to run this app. C# WinForm中从NES CHR二进制文件加载8x8 Tile并转换为可显示图像
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm中从NES CHR二进制文件加载8x8 Tile并转换为可显示图像

裸像素数组加载触发「Parameter is not valid」的核心原因

使用Image.FromStream(MemoryStream)接口解码时,要求输入的流必须包含完整的图像格式结构(含格式签名、尺寸声明、数据索引规则等头字段),才能正常解析生成图像。传入的纯像素R/G/B字节数组没有任何格式封装标识,完全不符合接口输入要求,因此会抛出参数非法错误。

可正常运行的Tile转换实现

结合你固定8x8尺寸、每像素按R/G/B顺序占3字节存储的Tile数据规则,通过Bitmap.SetPixel逐像素写入的方案已验证可正常工作,实现逻辑如下:

  • 初始化与Tile尺寸一致的空白Bitmap实例
  • 按行优先顺序遍历每个像素的横纵坐标
  • 根据坐标计算当前像素对应的字节数组偏移,依次读取R、G、B通道值
  • 将组装完成的颜色值通过SetPixel写入Bitmap对应坐标
  • 生成的Bitmap可直接赋值给PictureBox的Image属性展示

参考实现代码:

public Image ConvertTo8x8Tile(byte[] rgbPixelArray)
{
    // 24位色格式匹配每像素3字节的存储规则
    Bitmap tile = new Bitmap(8, 8, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    for (int y = 0; y < 8; y++)
    {
        for (int x = 0; x < 8; x++)
        {
            // 行优先排列的像素数据偏移计算
            int offset = (y * 8 + x) * 3;
            Color pixelColor = Color.FromArgb(
                red: rgbPixelArray[offset],
                green: rgbPixelArray[offset + 1],
                blue: rgbPixelArray[offset + 2]
            );
            tile.SetPixel(x, y, pixelColor);
        }
    }
    return tile;
}

性能优化提示:如果后续需要批量加载大量Tile做地图编辑,逐像素调用SetPixel的性能开销会随Tile数量上升明显,可通过LockBits直接操作图像内存块的方式替换逐像素写入逻辑,在不改动现有像素解析流程的前提下提升渲染效率。


内容的提问来源于stack exchange,提问作者zanto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 17:15:02