尽管我的照片还不错,但我找不到解决这两个错误的方法。如果有人能启发我,将不胜感激。
这是我得到的报告:
:(正确反映滤镜1x2图像
应该是“ 0 0 255 \ n255 0 ...”,而不是“ 255 0 0 \ n0 0 2 ...”
:)正确反映滤镜1x3图像
:)正确反映滤镜图像,这是它自己的镜像图像
:)正确反映滤镜3x3图像
:((正确反映4x4图像滤镜
应该是“ 100110120 \ n7 ...”,而不是“ 100110120 \ n4 ...”
这是我的代码:
RGBTRIPLE tmp[width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j <= width / 2; j++)
{
tmp[j] = image[i][j];
image[i][j] = image[i][width - 1 - j];
image[i][width - 1 - j] = tmp[j];
}
}
return;
答案 0 :(得分:0)
解决方案;
for循环中的条件需要进行一些微调;
j < width / 2
了解原因;
对于1x2图像,一行中有2个像素。宽度为2。为此只需进行1次迭代即可。在旧方案中,当j = 0时执行第一次迭代。但是随后还会执行第二次迭代,因为j = 1仍在条件内(等于width / 2)。不需要第二次迭代。您只是反射了两次,因此图像没有变化。
对于4x4图像,类似的问题。当j = 0且j = 1时,您应使用2次迭代来完成反射。但是,当j = 2(j仍等于且小于width / 2)时,将执行第3次迭代并将第3个像素替换为第一个像素错误。因为您已经更换过一次。
答案 1 :(得分:0)
我遇到了同样的问题,这是造成它的原因。
我假设您显示的代码仅适用于图像的左侧(即,将图像的左侧复制到临时图像中,并将图像的右侧复制到左侧中)。这部分是正确的,除了earik87指出的'<='vs'<'问题。
您没有显示图像右侧的代码,该代码将临时图像的左侧复制到右侧。我使用了类似的for循环,并假设您做了同样的事情。我将j的初始值设置为width / 2,这是问题所在:
通过使用width / 2,您将一个int除以一个int,结果将始终是一个int。
例如,如果width = 5,width / 2将返回2,表示图像的右侧从第2列开始。但是第2列是图像的中间行。我真正想做的是从第3列开始。所以我用
width / 2 + 1
但这给我带来了另一个问题,当宽度为偶数时,例如width = 4,我将从第3列开始,而我应从第2列开始。
要使此功能不管偶数还是奇数都可以使用,我们可以使用round()和一个浮动分母:
round(width / 2.0)
width / 2.0将返回一个浮点数,而round()将把该浮点数舍入为最接近的整数。