繁体   English   中英

C ++逐像素图像缩略图

[英]C++ pixel-by-pixel image thumbnailing

我的计算机科学课有一个特殊的任务,我们必须通过执行以下操作来减小图像的大小:

  1. 通过平均每个块的R,G和B值,找到n x n像素的块的平均颜色(n由用户指定)。
  2. 将颜色封装到一个像素中(只是一个普通的旧数据类)。
  3. 根据您的像素创建一个新图像。

当我说找到平均值时,是指每个块的平均颜色(如下所示,只有较小的颜色):

上面的图像将产生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...
}

现在还有一些工作:

  • 如果原始大小不是n的倍数,则必须更改代码以舍入缩略图的大小。
  • 当您达到x或y中的最大大小时,必须更改平均值,以便能够处理偏方。
  • 您当然必须更改平均计算,因为在现实世界中,您的颜色将使用int的整个范围,因此您必须找到最佳的平均方法,而不会发生溢出(例如:使用临时long ,使渐增平均值在您考虑的每个新像素,等等...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM