Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在快速函数中崩溃以替换bmp中的特定颜色_C_Colors_Bitmap_Pixel_Bmp - Fatal编程技术网

C 在快速函数中崩溃以替换bmp中的特定颜色

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

突然,我疯狂地创建了一个非常快速的函数来替换内存缓冲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;
}
问题是它崩溃了。。我正试图找出原因。

说明:

pixColumns += 3;
在for语句中和颜色替换后显示两次。
第二个太多了。

Ahh它必须是pixColumns-=3。我希望这是一个愚蠢的错误造成的。对更快函数的改进建议:表达式buff[*buffPixels+pixLines**buffWidth+pixColumns多次出现。请考虑使用指针引用图像中的像素来替换此表达式。此外,宽度/高度偏移错误。它们前面有1个字节。