Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中将一维数组视为二维数组来旋转图像_C_Arrays_Image Processing_Multidimensional Array_Rotation - Fatal编程技术网

在C中将一维数组视为二维数组来旋转图像

在C中将一维数组视为二维数组来旋转图像,c,arrays,image-processing,multidimensional-array,rotation,C,Arrays,Image Processing,Multidimensional Array,Rotation,我有一个一维数组,其中包含图像的R、G、B和填充数据。填充用于使图像的宽度可被4整除。数组如下所示(这只是一个简单的示例,我希望代码适用于任何大小的图像): 这是一个一维数组,但它表示一个图像,因此我需要找到一种方法将其视为二维数组,这样我就可以访问所需的图像行和列,从而对图像应用编辑,而无需将其转换为二维数组 我要做的是将图像向右旋转90度,向左旋转90度和180度 我得到的是数组的宽度、高度和大小 对于上面的数组,宽度为3个像素,即9个字节+3个填充字节,因此宽度为12个字节。高度等于行数,

我有一个一维数组,其中包含图像的R、G、B和填充数据。填充用于使图像的宽度可被4整除。数组如下所示(这只是一个简单的示例,我希望代码适用于任何大小的图像):

这是一个一维数组,但它表示一个图像,因此我需要找到一种方法将其视为二维数组,这样我就可以访问所需的图像行和列,从而对图像应用编辑,而无需将其转换为二维数组

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

我得到的是数组的宽度、高度和大小

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

我用油漆制作了以下图像,解释了我试图实现的目标(假设每个彩色正方形为1个像素):

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

是否可以仅使用像素宽度(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;i127){
imageArray[i*j]=0;
}否则{
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;
    }
}
(i=0;i127){ imageArray[i]=0; }否则{ 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.
}
for(在本例中,i=0;i127){
imageArray[i*j]=0;
}否则{
imageArray[i*j]=255;
}
}
//在编辑下一行之前添加填充像素。
}

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

要访问n元素的1维数组,因为它是2维(比如宽度和高度)数组,您需要选择宽度和高度的边界,以便宽度*高度=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)

阵列中没有填充填充在图像中,而不是阵列中。填充是数组每个“行”末尾的三个0值。它只是让每行字节数可以被4整除。为了访问像素,您需要使用
imageArray[i*(宽度*3+填充)+j]
而不是
imageArray[i*j]
。问题是它会对填充字节进行编辑,从而扭曲图像。我想保持填充字节不变(结尾为0),并且只对R、G、B字节进行编辑。除非你想在数组周围追逐像素,否则你会发现为旋转创建另一个图像更容易。
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
}