我有一个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像素):
从这张图片中我可以看到,有可能通过在每行上向右或向左移动像素来提出算法来执行旋转,但我无法针对一般情况提出此算法。我的程序必须能够旋转任何大小的图像。
是否可以仅使用像素宽度(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.
}
答案 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)