我编写了将该功能反映为.bmps的zip文件中提供的图像的功能。
通过一些研究,我发现许多解决此问题的人将图像的宽度除以2。但是,我觉得这不适用于我的代码。
该代码确实反映了肉眼所见的图像,但不符合check50提供的任何标准。
如果确实需要width / 2,即使在我的代码中,也请在我的代码实例中解释实现此逻辑的逻辑:
:( reflect correctly filters 1x2 image
expected "0 0 255\n255 0...", not "5 0 0\n255 0 0..."
:( reflect correctly filters 1x3 image
expected "0 0 255\n0 255...", not "5 0 0\n0 255 0..."
:( reflect correctly filters image that is its own mirror image
expected "255 0 0\n255 0...", not "5 0 0\n255 0 0..."
:( reflect correctly filters 3x3 image
expected "70 80 90\n40 5...", not "5 0 0\n40 50 6..."
:( reflect correctly filters 4x4 image
expected "100 110 120\n7...", not "5 0 0\n0 0 0\n..."
以下是错误消息:
npm install -g create-react-native-app
编辑: 在仔细检查以上代码输出的反射图像后,一切似乎都是完美的,除了带有稀疏颜色的额外细行像素-不知道为什么。通过放大图片的底部可以看到它,但是在输入的.bmp中看不到。
编辑2: 在仔细检查反射图像输出后,底部的“杂散”像素行似乎在中间结束了斑点。似乎反射图像的整个左半部分比预期的要高1个像素单位,而右半部分就好了。在图片的中央向下可见一条清晰的高度划分线。这开始变得有趣了。
答案 0 :(得分:2)
您有两个问题。
在步骤4中,尚未为数组的一半分配值。您可以将不确定的值用于第一行,而将旧值用于其他行。看起来就像将图像的一半移动了1行。
您应该使用标准的交换机制交换值。 如评论中所述,您无需打扰单独的字段,而只需交换整个结构:
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE temp;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
temp = image[i][j];
image[i][width - 1 - j] = image[i][j];
image[i][j] = temp;
}
}
return;
}
另外,如果您运行整个0..width-1
交换,则最终将image[i][0]
与image[i][width-1]
交换,随后将image[i][width-1]
与image[i][0]
交换。同一像素两次生成原始图像。
只需在条件j < width/2
下运行循环:
// define a SWAP macro just for convenience during following explanation
#define SWAP(x,y) \
do { \
RGBTRIPLE temp = (x); \
(x) = (y); \
(y) = temp; \
} while (0)
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width/2; j++)
{
// Replace image[i] to make code shorter during explanation.
RGBTRIPLE *row=image[i];
SWAP(row[j], row[width - 1 - j]);
}
}
return;
}
我做了2次确实不是必需的替换,但是使下面的文字短了很多。
为什么只循环到j < width/2
?如果要反转整数数组,让我们看一下每次迭代中的内存:
width==15
row: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
j=0; SWAP(row[0],row[14]);
row: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|14| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13| 0|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
...
j=5; SWAP(row[5],row[9]);
row: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|14|13|12|11|10| 9| 6| 7| 8| 5| 4| 3| 2| 1| 0|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
j=6; SWAP(row[6],row[8]);
row: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
j=7; SWAP(row[7],row[7]);
row: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
您可以看到,在交换了一半元素之后,我们就完成了。对于奇数个元素,最后一次交换只会交换本身而不起作用。
如果您现在继续运行到width
,请再次交换:
j=8; SWAP(row[8],row[6]);
row: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|14|13|12|11|10| 9| 6| 7| 8| 5| 4| 3| 2| 1| 0|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
...
j=13; SWAP(row[13],row[1]);
row: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|14| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13| 0|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
j=14; SWAP(row[14],row[0]);
row: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
这是我们开始的地方。
很明显,我们运行SWAP(row[j],row[width-j-1]);
,然后运行相同的索引,交换索引为SWAP(row[width-j-1],row[j]);
。
交换两次可恢复初始状态,并且您的图片不会更改。
答案 1 :(得分:0)
我用(效率不高)代码解决了这个问题!不需要宽度/ 2。使用一个临时数组和一个for循环将左侧的像素颜色与右侧的像素颜色交换!我不太了解其他答案中显示的width / 2方法,因此按我的理解,该方法对我有效。