在快速函数中崩溃以替换 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 中的特定颜色的主要内容,如果未能解决你的问题,请参考以下文章