2014-11-08 74 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