【发布时间】:2014-11-13 21:36:38
【问题描述】:
我正在尝试在 C/C++ 中创建一种算法,它将从左到右的均匀透明渐变应用于像素缓冲区。如下图所示:
接下来是我的实现。但生成的图像甚至不接近我需要实现的目标。任何人都可以发现我做错了什么?谢谢
void alphaGradient(uint32_t* pixelsBuffer, const int width, const int height)
{
const short OPAQUE = 255;
int pixelOffsetY, pixelIndex;
short A, R, G, B;
for (int y = 0; y < height; y++)
{
A = OPAQUE;
pixelOffsetY = y * height;
for (int x = 0; x < width; x++)
{
pixelIndex = pixelOffsetY + x;
A = (int)(OPAQUE - ((OPAQUE * x) / width));
R = (pixelsBuffer[pixelIndex] & 0x00FF0000) >> 16;
G = (pixelsBuffer[pixelIndex] & 0x0000FF00) >> 8;
B = (pixelsBuffer[pixelIndex] & 0x000000FF);
pixelsBuffer[pixelIndex] = (A << 24) + (R << 16) + (G << 8) + B;
}
}
}
【问题讨论】:
-
结果与您的预期有何不同?代码乍一看还不错。
-
您正在大量混合类型。在
A上,您将强制转换为有符号值,而(A << 24)在这里您将short移动了24 个字节。这不是未定义的行为吗?也许没关系,但在某些时候转换相当棘手。 -
你犯了一个简单的错误:
pixelOffsetY = y * height;应该是pixelOffsetY = y * width; -
@luk32: 24 个职位
-
@luk32 我认为通常的整数促销将在这里发挥作用,所以从
short开始应该不会受到伤害。但是制作所有东西uint32_t将是一个快速测试来确保。
标签: c++ c bitmap gradient transparent