突然之間,我創建了一個非常快速的功能,取代了內存緩衝的bmp圖像中的特定顏色的橫衝直撞。我正在用40x40的圖像進行測試,因此它是無鑲邊的。崩潰在一個快速的功能,以取代bmp中的特定顏色
這裏是我到目前爲止有:
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;
}
的問題是,它崩潰。而我試圖找出負責人認爲。
改進建議爲更快的功能:表達式buff [* buffPixels +(pixLines *(* buffWidth))+ pixColumns出現了幾次。考慮使用指針來引用圖像中的像素來替換此表達式。 – 2015-02-10 11:59:56
寬度/高度的偏移量也是錯誤的。它們提前1個字節。 – 2015-02-10 12:07:14