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

Posted

技术标签:

【中文标题】在快速函数中崩溃以替换 bmp 中的特定颜色【英文标题】:Crash in a fast function to replace a specific color in a bmp 【发布时间】:2015-02-10 10:50:00 【问题描述】:

突然间,我开始创建一个非常快速的函数来替换内存缓冲 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;

问题是它崩溃了。我正试图找出造成这种情况的原因。

【问题讨论】:

对更快函数的改进建议:表达式 buff[*buffPixels + (pixLines * (*buffWidth)) + pixColumns 出现多次。考虑使用指针来引用图像中的像素来替换这个表达式。 宽度/高度的偏移量也是错误的。它们提前 1 个字节。 【参考方案1】:

指令:

pixColumns += 3;

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

【讨论】:

啊,它必须是 pixColumns -= 3; 。我希望这个愚蠢的错误是负责任的。

以上是关于在快速函数中崩溃以替换 bmp 中的特定颜色的主要内容,如果未能解决你的问题,请参考以下文章

替换 CGBitmapContext 中的特定颜色

BMP 颜色反转功能不起作用

在xcode中替换openGl绘图中的特定颜色?

C - 改变 bmp 文件的像素颜色

混合颜色替换

替换 JSFL 中的填充颜色