所以我有一个学校项目,我们必须教授教授给我们的几节课,然后自己做一个图像组织者。
第一部分包括一组静态方法,以将图像本身编辑为Color数组(ColorImage类型)的2D数组。
第一个第一个问题是制作一个将图像缩小f倍的工具(原始像素的f平方像素在输出中变为1像素),而我的作品却行得通,但我认为不应该而且我不能弄清楚它为什么起作用,因此可以提供任何帮助。具体来说,我正在考虑对缓冲区数组(avgArr [] [])中每个位置的颜色求平均的循环(第16行)。我在想:每次迭代都会覆盖红色蓝色和绿色的值,而avgColor只会获取最后一个像素的vlaue,它从avgArr中获取rgb值。
static ColorImage downscaleImg(ColorImage img, int f) {
ColorImage dsi = new ColorImage(img.getWidth()/f, img.getHeight()/f);
Color[][] avgArr = new Color[f][f];
int reds = 0;
int greens = 0;
int blues = 0;
for(int i = 0; i < dsi.getWidth(); i++) {
for(int j = 0; j < dsi.getHeight(); j++) {
for(int x = i*f, xc = 0; x < i*f + (f-1); x++, xc++){
for(int y = j*f, yc = 0; y < j*f + (f-1); y++, yc++) {
avgArr[xc][yc] = img.getColor(x, y);
}
}
for(int k = 0; k < f - 1; k++){
for(int w = 0; w < f - 1; w++) {
reds += avgArr[k][w].getR();
greens += avgArr[k][w].getG();
blues += avgArr[k][w].getB();
}
}
int count = f*f;
Color avgColor = new Color(reds/count, greens/count, blues/count);
dsi.setColor(i, j, avgColor);
reds = 0;
greens = 0;
blues = 0;
}
}
return dsi;
}
谢谢,
编辑:事实证明,它实际上只是取了avgArr所看到的最后位置的颜色。欢迎提出任何纠正建议。
最佳答案
我认为您可以通过将红色/绿色/蓝色相加然后将它们除以最后的总像素来求出平均值来解决您的问题:
int reds = 0;
int greens = 0;
int blues = 0;
...
for(int k = 0; k < f - 1; k++){
for(int w = 0; w < f - 1; w++) {
reds += avgArr[k][w].getR(); // <-- note the +=
greens += avgArr[k][w].getG();
blues += avgArr[k][w].getB();
}
}
int count = (f-1)*(f-1);
Color avgColor = new Color(reds/count, greens/count, blues/count);