C 在快速函数中崩溃以替换bmp中的特定颜色
突然,我疯狂地创建了一个非常快速的函数来替换内存缓冲bmp图像中的特定颜色。我用40x40图像进行测试,因此它是无焊盘的 以下是我目前掌握的情况:C 在快速函数中崩溃以替换bmp中的特定颜色,c,colors,bitmap,pixel,bmp,C,Colors,Bitmap,Pixel,Bmp,突然,我疯狂地创建了一个非常快速的函数来替换内存缓冲bmp图像中的特定颜色。我用40x40图像进行测试,因此它是无焊盘的 以下是我目前掌握的情况: union { unsigned long ulColor; unsigned char byteColor[4]; } oldColor; union { unsigned long ulColor; unsigned char byteColor[4]; } newColor; typedef unsigned
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;
}
问题是它崩溃了。。我正试图找出原因。说明:
pixColumns += 3;
在for语句中和颜色替换后显示两次。
第二个太多了。Ahh它必须是pixColumns-=3。我希望这是一个愚蠢的错误造成的。对更快函数的改进建议:表达式buff[*buffPixels+pixLines**buffWidth+pixColumns多次出现。请考虑使用指针引用图像中的像素来替换此表达式。此外,宽度/高度偏移错误。它们前面有1个字节。