2014-11-08 69 views
0

我有我的计算机科学类特殊的任务,我们必须这样做,以减少图像的尺寸如下:C++逐像素的图像缩略

  1. 查找块的平均颜色通过对每个块的R,G和B值进行平均,n乘n像素(n由 用户给出)。
  2. 将该颜色封装到一个像素中(只是一个普通的旧数据类)。
  3. 使用您拥有的像素创建新图像。

当我说找到的平均值,我的意思是每个块的平均颜色(如下面,仅较小的):

上述图像将产生4像素* 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

开始创建其中n象素求n块的平均颜色的功能,开始与N = 1 – wimh 2014-11-08 19:36:43

+0

我想你有一种加载图像的方法。你如何得到图片的大小? – Christophe 2014-11-08 19:40:19

+0

@Christophe可以通过调用图像对象上的getWidth()和getHeight()来完成此操作。即'img.getWidth()'或'img.getHeight()' – Nick 2014-11-08 19:48:17

回答

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... 
} 

现在有一些工作左:

  • 你必须改变代码围捕缩略图的大小,如果原来的大小不是n的倍数。
  • 如果您在x或y中达到最大尺寸,您必须更改平均值,以便能够应对局部方块。
  • 你当然必须改变平均值计算,因为在现实世界中,你的颜色将使用int的全部范围,所以你必须找到最好的平均方法而不会溢出(例如:使用临时的long,使构建有序在每个新的像素平均递增你考虑到,等...)
+0

如果原始大小不是n的倍数,我忽略任何额外的像素。这种代码在这种情况下的表现如何? – Nick 2014-11-08 20:22:40

+0

这是一样的:'txSize'是一个'int',因此'img.getWidth()/ n'是整数部分,上面的代码只能达到'txSize * n'个像素。 – Christophe 2014-11-08 20:29:54