Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2010, 03:16   #1
RidDozZ
 
Аватар для RidDozZ
 
Регистрация: 30.03.2010
Сообщений: 4
По умолчанию Изменить уровень прозрачности 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 - медведы видны, а лучи - нет; при меньшем значении лучи прорисовываются, а медведы наоборот - исчезают).

Подскажите, плз, как правильно задавать значение полупрозрачности для подобных изображений.
RidDozZ вне форума Ответить с цитированием
Старый 28.05.2010, 13:47   #2
RidDozZ
 
Аватар для RidDozZ
 
Регистрация: 30.03.2010
Сообщений: 4
По умолчанию

В общем, помогли уже на другом форуме. Вот верный вариант, если кому понадобится:
Код:
...
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;
...

Последний раз редактировалось RidDozZ; 28.05.2010 в 13:52.
RidDozZ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TGifImage TJpegImage TPngImage FantasyDD Компоненты Delphi 0 24.05.2010 15:41
Поворот tPNGImage на нужный угол Altera Общие вопросы Delphi 3 08.09.2009 14:25
Как сделать регулятор прозрачности? Sanek777 Компоненты Delphi 6 23.09.2008 23:25
Организация прозрачности элементов в Delphi Vovnder Помощь студентам 4 26.11.2007 18:30
Про глюк прозрачности! Marsik Помощь студентам 15 08.11.2007 13:33