在C中处理一维数组(如二维数组)以旋转图像

时间:2016-03-27 14:41:53

标签: c arrays image-processing multidimensional-array rotation

我有一个1维数组,包含图像的R,G,B和填充数据。填充用于使图像的宽度可被4整除。数组看起来像这样(这只是一个简单的例子,我希望代码适用于任何大小的图像):

char imageArray[MAX] = {R,G,B,R,G,B,R,G,B,0,0,0,
                        R,G,B,R,G,B,R,G,B,0,0,0,
                        R,G,B,R,G,B,R,G,B,0,0,0}

这是一个一维数组,但它代表一个图像,所以我需要找到一种方法来对待它,就像一个二维数组,这样我就可以访问图像的所需行和列,以便对图像进行编辑而无需将其转换为二维数组。

我想要做的是将此图像向右旋转90度,向左旋转90度和180度。

我所拥有的是数组的宽度,高度和大小。

对于上面的数组,宽度为3个像素,即9个字节+ 3个填充字节,因此宽度为12个字节。高度等于行数,即3.数组的大小为((宽度* 3)+填充)*高度=((3 * 3)+3)* 3 = 36。

我在油漆中制作了以下图片,解释了我想要实现的目标(假设每个彩色方块都是1像素):

enter image description here

从这张图片中我可以看到,有可能通过在每行上向右或向左移动像素来提出算法来执行旋转,但我无法针对一般情况提出此算法。我的程序必须能够旋转任何大小的图像。

是否可以仅使用像素宽度(3),高度(3),填充(3)和数组大小(36)信息来实现阵列的这种修改?

这是我编写的一些代码,用于测试是否可以使用嵌套循环成功访问数组的每个部分,但它不起作用。这段代码非常简单,我用它来快速测试,我可以访问图像的所有部分。

for (i = 0; i < height; i++) { //height = 3 in this case
    for (j = 0; j < (width*3)+padding; j++) { //width = 3 and padding = 3 in this case
        if (imageArray[i*j] > 127) {
            imageArray[i*j] = 0;
        } else {
            imageArray[i*j] = 255;
        }
    }
}

但是这段代码不起作用。它产生一个奇怪的结果,它不访问数组中的每个元素。

以下代码生成所需的输出,但仅适用于没有填充的图像:

for (i = 0; i < arraySize; i++) { //array size is 36 in this case

    if (imageArray[i] > 127) {
        imageArray[i] = 0;
    } else {
        imageArray[i] = 255;
    }
}

在这种情况下如何处理填充?我上面做的是没有工作,所以一切都被移动,结果图像看起来搞砸了。如果没有填充,一切都很好。我可以绘制图像的每个“行”然后添加填充像素吗?我不确定该怎么做。例如,我可以执行以下操作来处理填充

for (i = 0; i < height; i++) { //height = 3 in this case
    for (j = 0; j < width*3+padding; j++) { //width = 3 and padding = 3 in this case
        if (imageArray[i*j] > 127) {
            imageArray[i*j] = 0;
        } else {
            imageArray[i*j] = 255;
        }
    }
    //adding padding pixels before editing the next row.
}

2 个答案:

答案 0 :(得分:1)

通过将int a[n*m]更改为int a[n][m],您可以将a[i][j]数组视为a[m*i+j]数组。也许这就是你写imageArray[i*j]时的尝试?

答案 1 :(得分:1)

要访问n元素的1-dim数组,因为它是2-dim(比如宽度和高度)数组,你需要选择宽度和高度的bounderies,以便width * height = n。这是访问1-dim数组元素的例子,因为它是2-dim:

type array[size];
type get_element(int x,int y)
{
   return array[y*width+x]; // jump y lines of length 'width' and get the x'th               //    element of the next line
}

示例: 对于大小为10的数组,您可以选择2-dim(2,5)或(5,2)
对于大小为18的数组,您可以选择2-dim(9,2)或(2,9)或(3,6)或(6,3)