我的计算机科学课有一项特殊的任务,我们必须通过以下方式减少图像的大小:
当我说找到平均值时,我的意思是每个块的平均颜色(如下所示,只有更小):
上面的图像会产生一个4px * 3px的图像缩略图。实际上,我们会将块大约10px平方左右。如果图像不能被块大小完全整除,我们应该忽略多余的像素。
可以直接访问图像的像素:
pixels[x][y].red = 130;
pixels[x][y].blue = 200; // etc
可以通过以下方式创建图像:
image x;
x.createNewImage(xSize, ySize);
pixel** xPixels = x.getPixels();
//then you can assign as above.
在尝试了很多不同的事情之后,我仍然不清楚如何解决这个问题。
答案 0 :(得分:0)
首先假设img
的大小是n
的倍数,以简化。您可以通过这种方式创建缩略图(注意:我没有尝试编译,因此可能会留下一些拼写错误):
int txSize=img.getWidth()/n, tySize=img.getHeight()/n;
pixel **pi=img.getPixels();
image t;
t.createNewImage(txSize, tySize);
pixel** pt=t.getPixels();
for (int i=0; i<txSize; i++)
for (int j=0; j<tySize; j++)
pt[i][j] = pixel_average(pi, i*n,j*n, n); // Part 2 of the question
当然,您需要Wimmel建议的平均功能:
pixel pixel_average(pixel**p, int x, int y, int n) // Part 1. of your question
{
pixel avg;
avg.red = 0; avg.blue=0; // etc...
for (int dx=0; dx <n; dx++)
for (int dy=0; dy<n; dy++) {
avg.red += p[x+dx][y+dy].red;
avg.blue += // etc...
}
avg.red = avg.red / n / n; // assuming that your colors are small enough, not to overflow.
// etc...
}
现在还有一些工作要做:
int
的全范围,所以你必须找到平均而不溢出的最佳方法(例如:use temporary {{ 1}},在你考虑的每个新像素上逐步建立加权平均值,等等......)