Я пишу очень простую графическую библиотеку и пытаюсь понять, как сделать альфа-смешивание.Я пробовал это несколько раз, но мои результаты были менее чем удовлетворительными.Согласно Википедии, я должен сделать:
Значение = (1-альфа) * 1005 * Значение0 + альфа значение1
Это, однако, не работает вообще.Может быть, я что-то не так делаю?
Код, который я включил, рисует красочную картинку (это функция «близости»), затем пытается нарисовать частично прозрачную рамку в (100,100).Однако вместо белой полупрозрачной рамки я получаю странное искажение изображения (я постараюсь, чтобы они были внизу моего поста).Какие-либо предложения?Вот мой код:
#include "hgl.h"
void proximity()
{
int x = 0, y = 0, d1, d2, d3, dcenter;
while(x < WIDTH){
while(y < HEIGHT){
d1 = distance(x, y, (WIDTH/2) - 200, (HEIGHT/2) + 200);
d2 = distance(x, y, (WIDTH/2) + 200, (HEIGHT/2) + 200);
d3 = distance(x, y, (WIDTH/2), (HEIGHT/2) - 150);
dcenter = distance(x, y, WIDTH/2, HEIGHT/2);
putpixel(x, y, d1, d2, d3);
y++;
}
y = 0;
x++;
}
}
int alpha_transparency(float alpha, float value1, float value2)
{
return (1-alpha) * value1 + alpha * value2;
}
void transparent_box(int pos_x, int pos_y, int width, int height, float alpha, char r, char g, char b)
{
int x = 0, y = 0;
while(x < width)
{
while(y < height)
{
int rr, rg, rb;
rr = alpha_transparency(alpha, p.bitmap[x+pos_x][y+pos_y].r, r);
rg = alpha_transparency(alpha, p.bitmap[x+pos_x][y+pos_y].g, g);
rb = alpha_transparency(alpha, p.bitmap[x+pos_x][y+pos_y].b, b);
putpixel(pos_x + x, pos_y + y, rr, rg, rb);
y++;
}
x++;
y = 0;
}
}
int main()
{
fp = fopen("out.bmp","wb");
set_dimensions(1440, 900);
insert_header();
white_screen();
proximity();
transparent_box(100, 100, 500, 500, .9, 255, 255, 255);
insert_image();
fclose(fp);
return 0;
}
Извините, я не смог включить вывод, потому что я новый пользователь.Тем не менее, вот ссылки:
Исходное изображение
Изображение с «прозрачной» рамкой