突然间,我开始疯狂地创建一个非常快速的功能,取代了内存缓冲的bmp图像中的特定颜色。我正在测试40x40图像,因此它是无垫的。
这是我到目前为止所做的:
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 :(得分:0)
指示:
pixColumns += 3;
在“for”语句和颜色替换后出现两次。 第二个太多了。