procedure DrawBGRAOnBitmap(Bitmap: TBitmap; bgr: Pointer; xStart, yStart, xFinish, yFinish: Integer);
var
X, Y: Integer;
pColor: PByteArray;
alpha: real;
Data: PByte;
begin
Data:=bgr;
for Y:=yStart to yFinish - 1 do
begin
pColor:=Bitmap.ScanLine[Y];
for X:=xStart to xFinish - 1 do
begin
case Data^ of
0: begin end;
255: begin
inc(Data);
pColor[X * 4]:= Data^;
inc(Data);
pColor[X * 4 + 1]:= Data^;
inc(Data);
pColor[X * 4 + 2]:= Data^;
inc(Data);
end
else
begin
alpha:=Data^ / 255;
inc(Data);
pColor[X * 3]:=Round(Data^ * alpha + pColor[X * 4] * (1 - alpha));
inc(Data);
pColor[X * 3 + 1]:=Round(Data^ * alpha + pColor[X * 4 + 1] * (1 - alpha));
inc(Data);
pColor[X * 3 + 2]:=Round(Data^ * alpha + pColor[X * 4 + 2] * (1 - alpha));
inc(Data);
end;
end;
end;
end;
end;
Найдите ошибку
Вот код вывода изображения на экран. Если изображение не содержит альфа-канала то отрисовывается правильно а если содержит то вообще не отрисовывается
Не уверен,что это то, что нужно, но посмотри
создания битовой карты. Возможно, ошибка кроется именно в выводе битмапа на устройство (например, оконный элемент).
До этого я из памяти(с указателя Data) записывал в массив данные цветов и потом уже назначал по сканлайну и всё работало - может проблемма неправильгого получения даных из памяти.
Думаю, что дело не в битмапе. Можешь проверить свой битмап, организовав его вывод на оконный элемент средствами OpenGL. Это тебе даст убедиться в том, правильный ли битмап выводишь, либо нет.
Когда проверяется наличие альфы и происходит перенаправление на обсчёт её то сдесь как-будто бы теряется указатель (т.е все данные которые далее пдаются для расчётов равны нулю)(переписывал в другой участок памяти и сохранял в файл - все данне это нули).
Нетб ну это надо же быть настолько тупым. Так и знал. Внимательно просмотрите код. Когда альфа = 0 тогда идёт такой код begin end; А указатель памяти не смещается поэтому достаточно одного пикселя полностью прозрачного чтобы ничего не отрисовалось.