Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.05.2010, 03:20
Аватар для RidDozZ
RidDozZ RidDozZ вне форума
Прохожий
 
Регистрация: 07.04.2010
Сообщения: 2
Репутация: 10
По умолчанию Изменить уровень прозрачности 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  
Старый 28.05.2010, 12:40
Аватар для urahara
urahara urahara вне форума
Новичок
 
Регистрация: 16.01.2010
Сообщения: 86
Репутация: 35
По умолчанию

отрисовывай при помощи Windows.AlphaBlend()
__________________
Arrrgh
Ответить с цитированием
  #3  
Старый 28.05.2010, 14:01
Аватар для RidDozZ
RidDozZ RidDozZ вне форума
Прохожий
 
Регистрация: 07.04.2010
Сообщения: 2
Репутация: 10
По умолчанию

Пробовал, не получилось. Знаний маловато.
Да и мне уже подсказали верный вариант на другом форуме:
Код:
...
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;
...
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:46.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter