所以我有一个学校项目,我们需要教授教授给我们的几节课,然后自己做一个图像组织者。
第一部分包括一组静态方法,以将图像本身编辑为Color数组(ColorImage类型)的2D数组。
第一个第一个问题是制作一个将图像缩小f倍的工具(原始像素的f平方像素在输出中变为1像素),而我的作品可行,但我认为不行,我无法弄清楚它为什么起作用,因此不胜感激。具体来说,我正在考虑对缓冲区数组(avgArr [] [])中每个位置的颜色求平均的循环(第16行)。我在想:每次迭代都会覆盖红色,蓝色和绿色的值,而avgColor只会获取最后一个像素的值,而该像素会从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的最后一个位置的颜色。欢迎提出任何纠正建议。
答案 0 :(得分:1)
我认为您可以通过以下方法解决问题:对红色/绿色/蓝色进行求和,然后将其除以最后的总像素,即可得出平均值:
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);