C#自定义Bitmap类时图像放大的矩阵复制错误修复求助
修复图像放大的矩阵循环逻辑
你的代码当前是对单个矩阵元素进行coeff倍复制,导致每个B/G/R分量被重复,而不是完整的BGR像素组重复,最终出现颜色异常。要解决这个问题,需要**按像素组(3个连续元素为一组)**处理复制逻辑,同时保持行方向的coeff倍放大。
修复后的完整代码
int coeff = 2; int index = 1; int line = 3; int column = 6; int[,] m = new int[line, column]; // 初始化原矩阵 for (int i = 0; i < m.GetLength(0); i++) { for (int j = 0; j < m.GetLength(1); j++) { m[i, j] = index; index++; Console.Write(m[i, j] + " "); } Console.WriteLine(); } int[,] matrix = new int[m.GetLength(0) * coeff, m.GetLength(1) * coeff]; // 修复后的循环逻辑 for (int i = 0; i < m.GetLength(0); i++) { // 行方向:将原行复制coeff次到新矩阵 for (int k = i * coeff; k < i * coeff + coeff; k++) { // 按像素组遍历(每次步进3,对应一个BGR像素的3个分量) for (int j = 0; j < m.GetLength(1); j += 3) { // 列方向:将当前像素组重复coeff次 for (int l = 0; l < coeff; l++) { // 完整复制当前像素组的3个元素 matrix[k, j * coeff + l * 3] = m[i, j]; matrix[k, j * coeff + l * 3 + 1] = m[i, j + 1]; matrix[k, j * coeff + l * 3 + 2] = m[i, j + 2]; } } } } // 输出验证修复结果 Console.WriteLine("\n修复后输出矩阵:"); for (int i = 0; i < matrix.GetLength(0); i++) { for (int j = 0; j < matrix.GetLength(1); j++) { Console.Write($"{matrix[i, j],3}"); } Console.WriteLine(); }
关键修改说明
- 行循环提前:先处理原矩阵的每一行,直接复制coeff行到新矩阵,保证行方向的放大逻辑正确
- 按像素组遍历:列方向循环改为
j += 3,每次处理一个完整的BGR像素组,而非单个颜色分量 - 完整复制像素组:每个像素组在列方向重复coeff次时,同步复制B、G、R三个元素,确保像素整体被放大
效果对比
原矩阵:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
修复后输出(与期望一致):
1 2 3 1 2 3 4 5 6 4 5 6 1 2 3 1 2 3 4 5 6 4 5 6 7 8 9 7 8 9 10 11 12 10 11 12 7 8 9 7 8 9 10 11 12 10 11 12 13 14 15 13 14 15 16 17 18 16 17 18 13 14 15 13 14 15 16 17 18 16 17 18
内容的提问来源于stack exchange,提问作者Noshi
相关产品推荐
相关产品推荐

