[英]C++ pixel-by-pixel image thumbnailing
我的计算机科学课有一个特殊的任务,我们必须通过执行以下操作来减小图像的大小:
当我说找到平均值时,是指每个块的平均颜色(如下所示,只有较小的颜色):
上面的图像将产生4px * 3px的图像缩略图。 实际上,我们将块设置为约10像素左右。 如果图像不能被块大小整除,我们应该忽略多余的像素。
图像的像素可以直接访问:
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.
在尝试了许多不同的方法之后,我仍然不清楚如何解决这个问题。
首先,为简化起见,假设img
的大小是n
的倍数。 您可以通过这种方式创建缩略图t( 注意:我没有尝试编译,因此可能会留下一些错字 ):
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
的整个范围,因此您必须找到最佳的平均方法,而不会发生溢出(例如:使用临时long
,使渐增平均值在您考虑的每个新像素,等等...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.