C#中合并3个byte[12x12x3]转Bitmap结果异常,求正确合并方法
正确合并三个12x12x3字节数组为36x12x3数组的方法
你的问题出在数组合并逻辑不符合水平拼接要求:当前直接将三个数组首尾拼接,相当于把三个12x12的图像垂直堆叠,但你需要的是将它们水平拼接成36x12的图像(每行由三个小图的对应行依次组成)。
错误原因分析
当前合并方式会把Arr001的所有像素放在结果数组的前432字节(12×12×3),对应目标Bitmap的y=0~11行的x=0~11;Arr002的内容从第432字节开始,按照setpixel的索引计算,这部分数据会对应y=12~23行的位置,但目标Bitmap只有12行(y=0~11),所以这部分数据完全不会被渲染,最终只显示第一个小图的内容,和预期不符。
正确的合并代码
我们需要按行合并:遍历每一行,依次将三个小图的当前行数据复制到目标数组的对应位置:
// 定义小图的基础参数 int smallWidth = 12; int smallHeight = 12; int pixelByteCount = 3; // RGB每个像素3字节 int smallRowSize = smallWidth * pixelByteCount; // 小图每行的字节数:12×3=36 // 初始化目标数组,大小为36×12×3=1296字节 byte[] ResultArray = new byte[36 * smallHeight * pixelByteCount]; for (int y = 0; y < smallHeight; y++) { // 计算当前行在目标数组中的起始索引 int targetRowStart = y * 36 * pixelByteCount; // 复制第一个小图的当前行到目标行的前12列 Array.Copy(Arr001, y * smallRowSize, ResultArray, targetRowStart, smallRowSize); // 复制第二个小图的当前行到目标行的中间12列 Array.Copy(Arr002, y * smallRowSize, ResultArray, targetRowStart + smallRowSize, smallRowSize); // 复制第三个小图的当前行到目标行的后12列 Array.Copy(Arr003, y * smallRowSize, ResultArray, targetRowStart + smallRowSize * 2, smallRowSize); }
代码说明
- 按行处理:遍历小图的每一行(
y从0到11),确保三个小图的同一行数据在目标数组中连续排列,对应目标Bitmap的同一行不同列。 - 索引计算:
- 小图每行的起始索引:
y * smallRowSize(每行36字节) - 目标数组当前行的起始索引:
y * 36 * 3(每行108字节)
- 小图每行的起始索引:
- 高效复制:使用
Array.Copy代替List拼接,性能更优且逻辑清晰。
这样合并后的数组传入setpixel方法,就能生成正确的36x12 Bitmap,三个小图会水平排列成一行。
内容的提问来源于stack exchange,提问作者Ribas Samuel
相关产品推荐
相关产品推荐

