![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Всем привет.
Возникла у меня проблема при обьеденении 2 TPNGObject's в 3й. Я попробовал 3й присвоить из 1го, и на него нанести 2й. Но прозрачность 2го не учитывается: http://www.delphisources.ru/forum/at...d=131045587 2 Посоветуйте кто-нибудь метод обьединения или способ обращения к альфа каналу. Заранее спасибо! P/S: Используемый мудуль для работы в с PNG во вложении. |
|
#2
|
||||
|
||||
|
Примерно так:
Последний раз редактировалось angvelem, 13.07.2011 в 00:01. |
|
#3
|
||||
|
||||
|
На всякий случай привожу функции копирования:
Код:
procedure DrawTransparentBitmap(Source: TBitmap; Destination: TCanvas; DestRect: TRect; Opacity: Byte);
var
BlendFunc: TBlendFunction;
begin
BlendFunc.BlendOp := AC_SRC_OVER;
BlendFunc.BlendFlags := 0;
BlendFunc.SourceConstantAlpha := Opacity;
if Source.PixelFormat = pf32bit then
BlendFunc.AlphaFormat := AC_SRC_ALPHA
else
BlendFunc.AlphaFormat := 0;
Windows.AlphaBlend(Destination.Handle, DestRect.Left, DestRect.Top, DestRect.Right - DestRect.Left, DestRect.Bottom - DestRect.Top,
Source.Canvas.Handle, 0, 0, Source.Width, Source.Height, BlendFunc);
end;
procedure DrawTransparentBitmap(Source: TBitmap; SourceRect: TRect; Destination: TCanvas; DestRect: TRect; Opacity: Byte);
var
BlendFunc: TBlendFunction;
begin
BlendFunc.BlendOp := AC_SRC_OVER;
BlendFunc.BlendFlags := 0;
BlendFunc.SourceConstantAlpha := Opacity;
if Source.PixelFormat = pf32bit then
BlendFunc.AlphaFormat := AC_SRC_ALPHA
else
BlendFunc.AlphaFormat := 0;
Windows.AlphaBlend(Destination.Handle, DestRect.Left, DestRect.Top, DestRect.Right - DestRect.Left, DestRect.Bottom - DestRect.Top,
Source.Canvas.Handle, SourceRect.Left, SourceRect.Top, SourceRect.Right - SourceRect.Left, SourceRect.Bottom - SourceRect.Top, BlendFunc);
end; |
|
#4
|
||||
|
||||
|
angvelem, спасибо за содействие, но я пытался в рамках PNG изображения.
Вот решение данной проблемы. Код:
procedure OverlapPNG(Layer2, Layer1: TPNGObject; var blendedPNG: TPNGObject);
var
x, y: Integer;
SL1, SL2, SLBlended: pRGBLine;
aSL1, aSL2, aSLBlended: PByteArray;
blendCoeff: single;
begin
blendedPNG.Assign(Layer1);
for y := 0 to Layer1.Height-1 do
begin
SL1 := Layer1.Scanline[y];
SL2 := Layer2.Scanline[y];
aSL1 := Layer1.AlphaScanline[y];
aSL2 := Layer2.AlphaScanline[y];
SLBlended := blendedPNG.Scanline[y];
aSLBlended := blendedPNG.AlphaScanline[y];
for x := 0 to Layer1.Width-1 do
begin
blendCoeff:=aSL1[x] * 100/255/100;
aSLBlended[x] := round(aSL2[x] + (aSL1[x]-aSL2[x]) * blendCoeff);
SLBlended[x].rgbtRed := round(SL2[x].rgbtRed + (SL1[x].rgbtRed-SL2[x].rgbtRed) * blendCoeff);
SLBlended[x].rgbtGreen := round(SL2[x].rgbtGreen + (SL1[x].rgbtGreen-SL2[x].rgbtGreen) * blendCoeff);
SLBlended[x].rgbtBlue := round(SL2[x].rgbtBlue + (SL1[x].rgbtBlue-SL2[x].rgbtBlue) * blendCoeff);
end;
end;
end; |
|
#5
|
||||
|
||||
|
Код:
c := TPngObject.Create;
a := TPngObject.Create;
b := TPngObject.Create;
a.LoadFromFile('tex/grass.png');
b.LoadFromFile('tex/player.png');
c.Assign(a);
b.Draw(c.Canvas,Rect(0,0,b.Width,b.Height));
c.SaveToFile('result.png'); |
|
#6
|
||||
|
||||
|
Вариаций исполнения масса, я привёл один из вариантов. Почему через битмап?
1. Привычка 2. ОС другого не понимает. 3. так захотелось. |