|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Обьединение 2х PNG в 3й
Всем привет.
Возникла у меня проблема при обьеденении 2 TPNGObject's в 3й. Я попробовал 3й присвоить из 1го, и на него нанести 2й. Но прозрачность 2го не учитывается: http://www.delphisources.ru/forum/at...d=131045587 2 Посоветуйте кто-нибудь метод обьединения или способ обращения к альфа каналу. Заранее спасибо! P/S: Используемый мудуль для работы в с PNG во вложении. |
#2
|
||||
|
||||
Примерно так:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось 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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#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. так захотелось. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |