在C中将一维数组视为二维数组来旋转图像
我有一个一维数组,其中包含图像的R、G、B和填充数据。填充用于使图像的宽度可被4整除。数组如下所示(这只是一个简单的示例,我希望代码适用于任何大小的图像): 这是一个一维数组,但它表示一个图像,因此我需要找到一种方法将其视为二维数组,这样我就可以访问所需的图像行和列,从而对图像应用编辑,而无需将其转换为二维数组 我要做的是将图像向右旋转90度,向左旋转90度和180度 我得到的是数组的宽度、高度和大小 对于上面的数组,宽度为3个像素,即9个字节+3个填充字节,因此宽度为12个字节。高度等于行数,即3。数组的大小是((宽度*3)+填充)*高度=((3*3)+3)*3=36 我用油漆制作了以下图像,解释了我试图实现的目标(假设每个彩色正方形为1个像素): 从这张图片中,我可以看到,通过将每行的像素向右或向左移动,可以提出一种执行旋转的算法,但对于一般情况,我无法提出这种算法。我的程序必须能够旋转任何大小的图像 是否可以仅使用像素宽度(3)、高度(3)、填充(3)和阵列大小(36)信息来实现阵列的这种修改 下面是我编写的一些代码,用于测试我是否可以使用嵌套循环成功访问数组的每个部分,但它不起作用。这段代码非常简单,我正在使用它快速测试我是否可以访问图像的所有部分在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个字节。高度等于行数,
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;ifor (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
}