Есть 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 - медведы видны, а лучи - нет; при меньшем значении лучи прорисовываются, а медведы наоборот - исчезают).
Подскажите, плз, как правильно задавать значение полупрозрачности для подобных изображений.