如何在不使用位图的情况下增加图片的尺寸?

问题描述 投票:0回答:1

我需要在 C# 中为项目重新创建 Bitmap 类。 我的目标之一是增加图像的尺寸。为此,我必须将图像转换为字节矩阵,现在我必须增加矩阵的大小并复制其值。 由于矩阵是图片的表示,因此每组 3 个值代表一个像素(BGR、B 蓝 G 绿和 R 红)。 因此,矩阵的列始终是 3 的倍数。 如果我要将该矩阵的大小增加一个整数,我将必须以正确的顺序复制这组 3 个值才能实际增加图像的大小。

这是我的代码,正如你所看到的,我通过更改矩阵的类型并给它更小的尺寸、基本值等来修改它。这样我就可以检查我的代码中的问题出在哪里。 但我不知道如何正确编写 for 循环及其内容。

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++)
            {
                for (int j = 0; j < m.GetLength(1); j++)
                {
                    for (int k = i * coeff; k < i * coeff + coeff; k++) \\the issue is here
                    {
                        for (int l = j * coeff; l < j * coeff + coeff; l++) \\and here
                        {
                            matrix[k, l] = m[i, j];
                        }

                    }
                }
            }

如果我使用字节矩阵和图像运行此代码,是的,它会增加图像,但不会放置正确的颜色(实际上我什至不明白它实际上如何为我提供具有不同颜色的正确图像,例如我应该给我一个不同的形象)

例如,如果我有系数为 2 的矩阵: 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

但我实际上明白了: 1 1 2 2 3 3 4 4 5 5 6 6 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 13 13 14 14 15 15 16 16 17 17 18 18

你能帮我解决这个问题吗?

c# math matrix bitmap
1个回答
0
投票

我不知道你到底是如何得到初始矩阵的。但如果缩放后得到不同颜色的正确图像,那么矩阵中的每个数字代表一个像素,而不是像素的颜色分量。在构建初始矩阵之前,您就丢失了颜色。

另外,不要在关键代码中使用多维数组,它们的实现速度非常慢。请改用嵌套数组。并且不要在 for 条件中使用 GetLength 方法,它会在每次迭代时调用。

如果您确实想进行问题中描述的矩阵变换,则只需将 j 和 l 加 3 而不是 1,并使用三元组而不是单个数字。

int coeff = 2;
int index = 1;
int line = 3;
int column = 6;

int[][] m = new int[line][];


for (int i = 0; i < line; i++)
{
    m[i] = new int[column];
    for (int j = 0; j < column; j++)
    {
        m[i][j] = index;
        index++;
        Console.Write(m[i][j] + " ");
    }
    Console.WriteLine();
}

int[][] matrix = new int[line * coeff][];

for (int i = 0; i < line; i++)
{
    for (int k = i * coeff; k < i * coeff + coeff; k++)
    {
        matrix[k] = new int[column * coeff];
    }
    
    for (int j = 0; j < column; j += 3)
    {
        for (int k = i * coeff; k < i * coeff + coeff; k++)
        {
            for (int l = j * coeff; l < j * coeff + coeff * 3; l += 3)
            {
                int[] matrixLine = matrix[k];
                int[] mLine = m[i];
                
                matrixLine[l + 0] = mLine[j + 0];
                matrixLine[l + 1] = mLine[j + 1];
                matrixLine[l + 2] = mLine[j + 2];
            }

        }
    }
}

Console.WriteLine();
for (int i = 0; i < line * coeff; i++)
{
    for (int j = 0; j < column * coeff; j++)
    {
        Console.Write(matrix[i][j] + " ");
    }
    Console.WriteLine();
}
© www.soinside.com 2019 - 2024. All rights reserved.