Изменить альфа-данные на пиксель для TPngImage - PullRequest
5 голосов
/ 15 июня 2011

Могу ли я напрямую изменить альфа-данные на пиксель для TPngImage между загрузкой их откуда-то и их прорисовкой где-нибудь? Если так, то как? Спасибо.

Ответы [ 2 ]

8 голосов
/ 15 июня 2011

Да, я думаю, что это легко.

Например, этот код установит непрозрачность на ноль (то есть прозрачность на 100%) для каждого пикселя в верхней половине изображения:

var
  png: TPNGImage;
  sl: PByteArray;

...

for y := 0 to png.Height div 2 do
begin
  sl := png.AlphaScanline[y];
  FillChar(sl^, png.Width, 0);
end;

Это создаст альфа-канал с линейным градиентом, от полной прозрачности (альфа = 0) до полной непрозрачности (альфа = 255) слева направо:

for y := 0 to png.Height do
begin
  sl := png.AlphaScanline[y];
  for x := 0 to png.Width - 1 do
    sl^[x] := byte(round(255*x/png.Width));
end;

По сути, я пытаюсь сказать, что это

(png.AlphaScanline[y]^)[x]

- это альфа-значение (непрозрачность) в байтах пикселя в строке y и столбце x.

3 голосов
/ 15 июня 2011

Вы можете использовать что-то вроде этого:

for Y := 0 to Image.Height - 1 do begin
  Line := Image.AlphaScanline[Y];
  for X := 0 to Image.Width - 1 do begin        
      Line[X] := ALPHA        
  end;
end;
...