2015-02-10 19 views
0

突然之間,我創建了一個非常快速的功能,取代了內存緩衝的bmp圖像中的特定顏色的橫衝直撞。我正在用40x40的圖像進行測試,因此它是無鑲邊的。崩潰在一個快速的功能,以取代bmp中的特定顏色

enter image description here

這裏是我到目前爲止有:

union 
{ 
    unsigned long ulColor; 
    unsigned char byteColor[4]; 
} oldColor; 
union 
{ 
    unsigned long ulColor; 
    unsigned char byteColor[4]; 
} newColor; 

typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned char BYTE; 

DWORD 
bitfox_color_replace_data 
(BYTE *buff, BYTE old_r, BYTE old_g, BYTE old_b, BYTE new_r, BYTE new_g, BYTE new_b) 
{ 
    #define OFFSET_OF_PIXELS 0xA 
    #define OFFSET_OF_WIDTH  0x13 
    #define OFFSET_OF_HEIGHT 0x17 

    DWORD* buffPixels = (DWORD*)&buff[OFFSET_OF_PIXELS]; 
    DWORD* buffWidth = (DWORD*)&buff[OFFSET_OF_WIDTH]; 
    DWORD* buffHeight = (DWORD*)&buff[OFFSET_OF_HEIGHT]; 
    WORD pad   = (*buffWidth) % 4; 

    DWORD pixLines, pixColumns; 
    DWORD pixels_replaced = 0; 

    oldColor.byteColor[0] = old_r; 
    oldColor.byteColor[1] = old_g; 
    oldColor.byteColor[2] = old_b; 

    for(pixLines = 0; pixLines < *buffHeight; pixLines++) 
    { 
     for(pixColumns = 0; pixColumns < (*buffWidth * 3) - 3; pixColumns += 3) //-2 -3 
     { 
      newColor.byteColor[0] = buff[*buffPixels + (pixLines * (*buffWidth)) + pixColumns]; 
      newColor.byteColor[1] = buff[*buffPixels + (pixLines * (*buffWidth)) + pixColumns + 1]; 
      newColor.byteColor[2] = buff[*buffPixels + (pixLines * (*buffWidth)) + pixColumns + 2]; 

      if(oldColor.ulColor == newColor.ulColor) 
      { 
       memcpy(&buff[*buffPixels + (pixLines * (*buffWidth)) + pixColumns], newColor.ulColor, 3); 
       pixColumns += 3; 
       pixels_replaced++; 
      } 
     } 
    } 
    return pixels_replaced; 
} 

的問題是,它崩潰。而我試圖找出負責人認爲。

+0

改進建議爲更快的功能:表達式buff [* buffPixels +(pixLines *(* buffWidth))+ pixColumns出現了幾次。考慮使用指針來引用圖像中的像素來替換此表達式。 – 2015-02-10 11:59:56

+0

寬度/高度的偏移量也是錯誤的。它們提前1個字節。 – 2015-02-10 12:07:14

回答

0

指令:

pixColumns += 3; 

出現了兩次,在 「爲」 語句和顏色替換之後。 第二個是太多了。

+0

啊,它必須是'pixColumns - = 3;'。我希望這個愚蠢的錯誤是有責任的。 – 2015-02-10 11:56:43

+0

它仍然崩潰。 – 2015-02-10 12:11:22