![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Есть TPngImage с загруженным в него изображением. Необходимо в нем же нарисовать это изображение с заданным уровнем альфы (полупрозрачности). Можно и через временный TPNGImage (да хотя бы через TBitmap).
С непрозрачными изображениями все просто: меняем это значение через AlphaScanline. Код:
procedure SetTransparent(alpha:byte);
var png:TPNGImage;
x,y:integer;
d:integer;
DstAlpha:pByteArray;
begin
png:=TPNGImage.CreateBlank(COLOR_RGB,8,10,10);
png.LoadFromFile('somefile.png');
for y:=0 to png.Height-1 do begin
DstAlpha:=png.AlphaScanline[y];
for x:=0 to png.Width-1 do begin
if DstAlpha[x]<>0 then begin
d:=DstAlpha[x]-alpha;
if d<=0 then DstAlpha[x]:=0
else DstAlpha[x]:=DstAlpha[x]-d;
end;
end;
end;
// Ну и прорисовка его куда-нибудь через Canvas.Draw(...);
png.Free;
end;Исходное изображение: ![]() Оно же, с полупрозрачностью 250: ![]() Оно же, с полупрозрачностью ~20: ![]() Делал вышеприведенной функцией. Как можно заметить, изображение состоит из 2х слоев, значение полупрозрачности у которых прямо противоположное (при 255 - медведы видны, а лучи - нет; при меньшем значении лучи прорисовываются, а медведы наоборот - исчезают). Подскажите, плз, как правильно задавать значение полупрозрачности для подобных изображений. |
|
#2
|
||||
|
||||
|
отрисовывай при помощи Windows.AlphaBlend()
|
|
#3
|
||||
|
||||
|
Пробовал, не получилось. Знаний маловато.
Да и мне уже подсказали верный вариант на другом форуме: Код:
...
for y:=0 to png.Height-1 do begin
DstAlpha:=png.AlphaScanline[y];
for x:=0 to png.Width-1 do
DstAlpha[x]:=DstAlpha[x]*alpha div 256;
end;
... |