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
相关产品推荐
相关产品推荐

