|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Изменить уровень прозрачности TPNGImage
Есть 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()
Arrrgh |
#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; ... |