我有一个指定高度和宽度的图像要缩小1/4。我这样做的方法是采用4个像素(例如(0,0),(1,0),(0,1),(1,1)),抓取每个像素的RGB值然后平均RGB值并将其作为一个像素注入新图像(因此前面提到的那四个像素合并将成为新图像的(0,0))。
它有效;我在结果中得到了一些颜色的好感。
左边是原始图像,右边是通过上面的方法处理。我不能为我的生活弄清楚为什么颜色会变得棘手。
对于它的价值,我使用以下方法:
getPixel();
getColor();
setColor();
RGB值通过getRed()
等单独获取。这些值存储为整数。
答案 0 :(得分:2)
看起来像溢出。什么数据类型是R,G和B?如果它们是8位无符号,则在添加和移位之前转换为16位无符号。平均值将在适当的范围内出现,因为平均值不能超过给定的最小值到最大值的范围,但中间的总和很容易这样做。
如果你不介意慢速处理,转换为浮点数,加4除以4,然后转换回来。可以完成更多的数学运算,例如对数,双曲线切线(我最喜欢的)等。但是你的问题并不表示需要这样的东西。然而,当数学变得沉重时,这几乎是通用的解决方案。
答案 1 :(得分:2)
你在哪里重置变量r,g,b?
b既用于颜色又用于迭代?
答案 2 :(得分:2)
您永远不会在循环中重置r,g,b
,因此下一个像素未获得正确的值(在任何情况下)。它将四个像素添加到最后一个像素结果,然后除以4.
由于有五个数字加在一起,你的颜色值会逐渐增加。例如,如果前一个像素红色值为240
,接下来的四个为220,220,220,220
,那么即使所有四个像素都为280
,您的“平均值”也会为220
}。然后,下一个像素进一步混乱,等等。
这就是为什么你会有一个“蠕动”溢出。当一个超过255时,当数字与setColor()
组合在一起时,会出现溢出。您可以清楚地看到每个字节溢出的位置。首先是红色(在青色区域),然后黄色掉出来(深蓝色)。
请在致电r,g,b
后确保将setColor()
重置为零,并且应该没问题。
答案 3 :(得分:0)
只需将r,g,b声明为 long unsigned int。
long unsigned int r,g,b;
在颜色可能为(255,0,0)且格式为RGBA的位置。 R 组件被移位24位以消耗最高8位。即使乘以2也可能导致无符号32位int溢出。使用64位(有符号或无符号)可以解决这个问题