Я пытаюсь создать алгоритм в C/C++, который применяет равномерный прозрачный градиент слева направо к буферу пикселей. Как видно на следующем изображении:Применение прозрачного градиента слева направо в 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 байта. Разве это не неопределенное поведение? Возможно, все в порядке, но в некоторых случаях конверсии довольно сложны. – luk32
Вы сделали простую ошибку: 'pixelOffsetY = y * height;' должно быть 'pixelOffsetY = y * width;' –