在快速功能中崩溃以替换bmp中的特定颜色

时间:2015-02-10 10:50:00

标签: c colors bitmap pixel bmp

突然间,我开始疯狂地创建一个非常快速的功能,取代了内存缓冲的bmp图像中的特定颜色。我正在测试40x40图像,因此它是无垫的。

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;
}

问题是它崩溃了......而我正在试图找出对此负责的原因。

1 个答案:

答案 0 :(得分:0)

指示:

pixColumns += 3;

在“for”语句和颜色替换后出现两次。 第二个太多了。