2017-04-02 63 views
0

下面的代碼是我的老師給我的。我只是不明白這是如何縮放bmp圖像。我知道關於bmp圖像的基礎知識(wikipedia上的信息)。我知道這種方法應該用任何比例乘以新圖像的行和列。我試圖手動運行代碼,但它讓我更加困惑。任何幫助都感激不盡。謝謝!不明白這段代碼是如何縮放bmp圖像的

int enlarge(PIXEL* original, int rows, int cols, int scale, 
     PIXEL** new, int* newrows, int* newcols) 
{ 
    //scaling the new rows & cols 
    *newcols = cols * scale; 
    *newrows = rows * scale; 

    //memory allocated for enlaged bmp 
    *new = (PIXEL*)malloc(*newrows * *newcols * sizeof(PIXEL)); 

    int row, col, sx, sy; 


    //transverse through every row 
    for (row = 0; row < rows; row++) 
    //transvere through every col 
    for (col = 0; col < cols; col++){ 
     //im unsure what this is for 
     PIXEL* o = original + (row * cols) + col; 
    for(sy = 0; sy < scale; sy++) 
    for(sx = 0; sx < scale; sx++) 
      { 
       //im unsure what this is for 
       PIXEL* n = *new + (scale * row) * *newcols + (scale * col) + (sy * *newcols) + sx; 
       *n = *o; 
      } 
    } 
    return 0; 
} 

這是PIXEL的結構。

typedef struct { 
    unsigned char r; 
    unsigned char g; 
    unsigned char b; 
} PIXEL; 

有額外的代碼,但我不認爲這是需要這個問題。

+0

內兩個環路填寫與像素的副本放大的版本的方通過'O'指向。 'o'只是您在所有像素上循環的上下文中的「當前像素」。 – harold

+0

它在每個像素處做了什麼? – name

回答

1
PIXEL* o = original + (row * cols) + col; 

在這裏,他正在檢索指向源圖像的原始圖像的指針;基於位圖中的行在內存中連續的事實,它只是簡單的指針算術。一般來說,在C風格矩陣width範圍內,元素(x,y)的地址是beginning + (y * width) + x

然後,他會遍歷scale X scale廣泛的目標圖像在一個廣場。

for(sy = 0; sy < scale; sy++) 
for(sx = 0; sx < scale; sx++) 
     { 
      //im unsure what this is for 
      PIXEL* n = *new + (scale * row) * *newcols + (scale * col) + (sy * *newcols) + sx; 

n指針指向目標圖像中的目標像素;如果你從源圖像的條件匹配上面的公式,並重新安排了一下,你會看到他正在訪問的新形象,在位置

(scale * col + sx, scale * row + sy) 

(記住,新的圖像是*newcols寬)。

  *n = *o; 

在這裏,他只是將源像素複製到目標像素。

實際上,他在目標圖像中將每個源像素「擴展」爲比例x比例尺正方形。

+1

這是一個很好的解釋。非常感謝你! – name