【发布时间】:2015-04-11 02:25:28
【问题描述】:
我正在构建一个函数,用另一种目标颜色替换 BMP 图像中的颜色。 只要我不尝试替换图像中需要填充的颜色,它就可以工作。 但是,我几乎可以肯定我的帐户填充方式是正确的。所以对我来说这完全是个谜。
330 x 250(248 054 字节)高彩 24 位位图
这是函数:
union
{
unsigned long ulColor;
unsigned char byteColor[4];
} oldColor;
union
{
unsigned long ulColor;
unsigned char byteColor[4];
} newColor;
typedef unsigned char BYTE;
typedef unsigned short int WORD;
typedef unsigned long int DWORD;
typedef unsigned long long int DDWORD;
DDWORD
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_SIZE 0x2
#define OFFSET_OF_PIXELS 0xA
#define OFFSET_OF_WIDTH 0x12
#define OFFSET_OF_HEIGHT 0x16
DWORD* buffSize = (DWORD*)&buff[OFFSET_OF_SIZE];
DWORD* buffPixels = (DWORD*)&buff[OFFSET_OF_PIXELS];
DWORD* buffWidth = (DWORD*)&buff[OFFSET_OF_WIDTH];
DWORD buffHeight = 0;
BYTE pad = 0;
DDWORD pixels_replaced = 0;
DDWORD i;
oldColor.byteColor[0] = old_b; newColor.byteColor[0] = new_b;
oldColor.byteColor[1] = old_g; newColor.byteColor[1] = new_g;
oldColor.byteColor[2] = old_r; newColor.byteColor[2] = new_r;
for(i = (*buffPixels); i < (*buffSize); i += 3)
{
if( i == ((*buffPixels) + (((*buffWidth) * 3) + pad) * (buffHeight + 1)) )
{
pad = ((*buffWidth) % 4);
buffHeight++;
i += pad;
}
if(!memcmp(buff + i, oldColor.byteColor, 3))
{
memcpy(buff + i, newColor.byteColor, 3);
pixels_replaced++;
}
}
return pixels_replaced;
}
我可能做错了什么?
【问题讨论】:
-
如果您提供了一种读取文件的方法,以便可以单步执行代码,则可能更容易发现错误。我看到的问题静态地围绕着用于输入
pad =语句的条件语句。我不明白你选择条件的标准:if( i == ((*buffPixels) + (((*buffWidth) * 3) + pad) * (buffHeight + 1)) ) -
@ryyker 尝试找出一种方法来考虑在此特定函数中进行填充,您最终可能也会得到类似的结果。
i也到达了填充,因此它需要包含在确定i是否位于一行像素末尾的公式中。 -
你能用
y计数器的高度和x计数器的宽度将指针混乱重写为例程吗?我怀疑如果你这样做并且仍然考虑填充,问题就会神秘地消失。