Salut,
Je recherche une procédure qui me permettrait la même fonction que DrawAlphaImage, l'API AlphaBlend ne donne pas de bon résultat pour ce que j'essaie d'en faire.
Si vous avez ça dans votre hotte, ça m'intéresse.
recherche code équivalent à DrawAlphaImage
Salut Nico,
je n'ai pas de code tout prêt mais tu peux essayer de te l'écrire avec les explications de MS sur la transparence
http://msdn2.microsoft.com/en-us/library/ms533803.aspx
A+
Denis
je n'ai pas de code tout prêt mais tu peux essayer de te l'écrire avec les explications de MS sur la transparence
http://msdn2.microsoft.com/en-us/library/ms533803.aspx
A+
Denis
Dernière modification par Anonyme2 le sam. 29/mars/2008 11:02, modifié 1 fois.
Il y a un code tout frais de netmaestro ici
http://www.purebasic.fr/english/viewtopic.php?t=31691
et je me suis souvenu de codes de Danilo (2003) ici
http://www.purebasic.fr/english/viewtop ... transcolor
A+
Denis
http://www.purebasic.fr/english/viewtopic.php?t=31691
et je me suis souvenu de codes de Danilo (2003) ici
http://www.purebasic.fr/english/viewtop ... transcolor
A+
Denis
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse
un bien belle procédure, encore faut-il savoir l'exploiter...Denis a écrit :Il y a un code tout frais de netmaestro ici
http://www.purebasic.fr/english/viewtopic.php?t=31691
et je me suis souvenu de codes de Danilo (2003) ici
http://www.purebasic.fr/english/viewtop ... transcolor
A+
Denis
Code : Tout sélectionner
ProcedureDLL TransBlit(hdc, hBitmap, xStart, yStart, TransColor)
; by netmaestro based on http://support.microsoft.com/kb/79212/EN-US/
Define.POINT ptSize
hdcTemp = CreateCompatibleDC_(hdc)
SelectObject_(hdcTemp, hBitmap)
GetObject_(hBitmap, SizeOf(BITMAP), bm.BITMAP)
ptSize\x = bm\bmWidth
ptSize\y = bm\bmHeight
DPtoLP_(hdcTemp, @ptSize, 1)
hdcBack = CreateCompatibleDC_(hdc)
hdcObject = CreateCompatibleDC_(hdc)
hdcMem = CreateCompatibleDC_(hdc)
hdcSave = CreateCompatibleDC_(hdc)
bmAndBack = CreateBitmap_(ptSize\x, ptSize\y, 1, 1, #Null)
bmAndObject = CreateBitmap_(ptSize\x, ptSize\y, 1, 1, #Null)
bmAndMem = CreateCompatibleBitmap_(hdc, ptSize\x, ptSize\y)
bmSave = CreateCompatibleBitmap_(hdc, ptSize\x, ptSize\y)
bmBackOld = SelectObject_(hdcBack, bmAndBack)
bmObjectOld = SelectObject_(hdcObject, bmAndObject)
bmMemOld = SelectObject_(hdcMem, bmAndMem)
bmSaveOld = SelectObject_(hdcSave, bmSave)
SetMapMode_(hdcTemp, GetMapMode_(hdc))
BitBlt_(hdcSave, 0, 0, ptSize\x, ptSize\y, hdcTemp, 0, 0, #SRCCOPY)
cColor = SetBkColor_(hdcTemp, TransColor)
BitBlt_(hdcObject, 0, 0, ptSize\x, ptSize\y, hdcTemp, 0, 0, #SRCCOPY)
SetBkColor_(hdcTemp, cColor)
BitBlt_(hdcBack, 0, 0, ptSize\x, ptSize\y, hdcObject, 0, 0, #NOTSRCCOPY)
BitBlt_(hdcMem, 0, 0, ptSize\x, ptSize\y, hdc, xStart, yStart, #SRCCOPY)
BitBlt_(hdcMem, 0, 0, ptSize\x, ptSize\y, hdcObject, 0, 0, #SRCAND)
BitBlt_(hdcTemp, 0, 0, ptSize\x, ptSize\y, hdcBack, 0, 0, #SRCAND)
BitBlt_(hdcMem, 0, 0, ptSize\x, ptSize\y, hdcTemp, 0, 0, #SRCPAINT)
BitBlt_(hdc, xStart, yStart, ptSize\x, ptSize\y, hdcMem, 0, 0, #SRCCOPY)
BitBlt_(hdcTemp, 0, 0, ptSize\x, ptSize\y, hdcSave, 0, 0, #SRCCOPY)
DeleteObject_(SelectObject_(hdcBack, bmBackOld))
DeleteObject_(SelectObject_(hdcObject, bmObjectOld))
DeleteObject_(SelectObject_(hdcMem, bmMemOld))
DeleteObject_(SelectObject_(hdcSave, bmSaveOld))
DeleteDC_(hdcMem)
DeleteDC_(hdcBack)
DeleteDC_(hdcObject)
DeleteDC_(hdcSave)
DeleteDC_(hdcTemp)
EndProcedure
Merci, j'ai pu créer la procédure avec ces codes, mais les nombres signés rallonge le code, je ne sais pas si on peut optimiser:
Code : Tout sélectionner
UsePNGImageDecoder()
Procedure AlphaBlend(Image1,Image2)
Structure _LTI_BITMAPINFO
bmiHeader.BITMAPINFOHEADER
bmiColors.RGBQUAD[1]
EndStructure
Structure BGRA
Blue.b
Green.b
Red.b
Alpha.b
EndStructure
Structure BGRAL
Blue.l
Green.l
Red.l
Alpha.l
EndStructure
hDC1 = StartDrawing(ImageOutput(Image1))
hDC2= CreateCompatibleDC_(hDC1)
SelectObject_(hDC2,ImageID(Image2))
If hDC1 And hDC2
ImageWidth = ImageWidth(Image1) : ImageHeight = ImageHeight(Image1)
mem1 = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth*ImageHeight*4)
mem2 = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth*ImageHeight*4)
If mem1>0 And mem2>0
bmi._LTI_BITMAPINFO
bmi\bmiHeader\bisize = SizeOf(BITMAPINFOHEADER)
bmi\bmiheader\biWidth = ImageWidth
bmi\bmiheader\biHeight = ImageHeight
bmi\bmiheader\biPlanes = 1
bmi\bmiheader\biBitCount = 32
bmi\bmiheader\biCompression = #BI_RGB
GetDIBits_(hDC1,ImageID(Image1),0,ImageHeight,mem1,bmi,#DIB_RGB_COLORS)
GetDIBits_(hDC2, ImageID(Image2), 0, ImageHeight, mem2, bmi, #DIB_RGB_COLORS)
*color1.BGRA = mem1
*color2.BGRA = mem2
color1Long.BGRAL
color2Long.BGRAL
For a = 0 To (ImageWidth*ImageHeight)-1
color1Long\Blue = *color1\Blue & $FF
color1Long\Green = *color1\Green & $FF
color1Long\Red = *color1\Red & $FF
color1Long\Alpha = *color1\Alpha & $FF
color2Long\Blue = *color2\Blue & $FF
color2Long\Green = *color2\Green & $FF
color2Long\Red = *color2\Red & $FF
color2Long\Alpha = *color2\Alpha & $FF
ColorBlue.b = color1Long\Blue * color1Long\Alpha / 255 + color2Long\Blue * (255 - color1Long\Alpha) / 255
ColorGreen.b = color1Long\Green * color1Long\Alpha / 255 + color2Long\Green * (255 - color1Long\Alpha) / 255
ColorRed.b = color1Long\Red * color1Long\Alpha / 255 + color2Long\Red * (255 - color1Long\Alpha) / 255
*color1\Blue = ColorBlue
*color1\Green = ColorGreen
*color1\Red = ColorRed
*color1 + 4
*color2 + 4
Next a
If SetDIBits_(hdc1, ImageID(Image1),0,ImageHeight,mem1,bmi,#DIB_RGB_COLORS) <> 0
Result = ImageID(Image1)
Debug "popo"
EndIf
EndIf
If mem1
GlobalFree_(mem1)
EndIf
If mem1
GlobalFree_(mem2)
EndIf
EndIf
StopDrawing()
DeleteDC_(hDC2)
ProcedureReturn Result
EndProcedure
;les deux images doivent avoir la même dimension
LoadImage(0,"); image avec couche alpha
LoadImage(1,")
OpenWindow(0,0,0,400,400,"Image",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
ImageGadget(0,0,0,0,0,ImageID(0))
ImageGadget(1,0,100,0,0,ImageID(1))
ImageGadget(2,0,200,0,0,0)
;copie l'image1 avec couche alpha sur l'image 2
result=AlphaBlend(0,1)
SetGadgetState(2,result)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Salut beauregard,beauregard a écrit :un bien belle procédure, encore faut-il savoir l'exploiter...Denis a écrit :Il y a un code tout frais de netmaestro ici
http://www.purebasic.fr/english/viewtopic.php?t=31691
et je me suis souvenu de codes de Danilo (2003) ici
http://www.purebasic.fr/english/viewtop ... transcolor
A+
DenisCode : Tout sélectionner
ProcedureDLL TransBlit(hdc, hBitmap, xStart, yStart, TransColor) ; by netmaestro based on http://support.microsoft.com/kb/79212/EN-US/ Define.POINT ptSize hdcTemp = CreateCompatibleDC_(hdc) SelectObject_(hdcTemp, hBitmap) GetObject_(hBitmap, SizeOf(BITMAP), bm.BITMAP) ptSize\x = bm\bmWidth ptSize\y = bm\bmHeight DPtoLP_(hdcTemp, @ptSize, 1) hdcBack = CreateCompatibleDC_(hdc) hdcObject = CreateCompatibleDC_(hdc) hdcMem = CreateCompatibleDC_(hdc) hdcSave = CreateCompatibleDC_(hdc) bmAndBack = CreateBitmap_(ptSize\x, ptSize\y, 1, 1, #Null) bmAndObject = CreateBitmap_(ptSize\x, ptSize\y, 1, 1, #Null) bmAndMem = CreateCompatibleBitmap_(hdc, ptSize\x, ptSize\y) bmSave = CreateCompatibleBitmap_(hdc, ptSize\x, ptSize\y) bmBackOld = SelectObject_(hdcBack, bmAndBack) bmObjectOld = SelectObject_(hdcObject, bmAndObject) bmMemOld = SelectObject_(hdcMem, bmAndMem) bmSaveOld = SelectObject_(hdcSave, bmSave) SetMapMode_(hdcTemp, GetMapMode_(hdc)) BitBlt_(hdcSave, 0, 0, ptSize\x, ptSize\y, hdcTemp, 0, 0, #SRCCOPY) cColor = SetBkColor_(hdcTemp, TransColor) BitBlt_(hdcObject, 0, 0, ptSize\x, ptSize\y, hdcTemp, 0, 0, #SRCCOPY) SetBkColor_(hdcTemp, cColor) BitBlt_(hdcBack, 0, 0, ptSize\x, ptSize\y, hdcObject, 0, 0, #NOTSRCCOPY) BitBlt_(hdcMem, 0, 0, ptSize\x, ptSize\y, hdc, xStart, yStart, #SRCCOPY) BitBlt_(hdcMem, 0, 0, ptSize\x, ptSize\y, hdcObject, 0, 0, #SRCAND) BitBlt_(hdcTemp, 0, 0, ptSize\x, ptSize\y, hdcBack, 0, 0, #SRCAND) BitBlt_(hdcMem, 0, 0, ptSize\x, ptSize\y, hdcTemp, 0, 0, #SRCPAINT) BitBlt_(hdc, xStart, yStart, ptSize\x, ptSize\y, hdcMem, 0, 0, #SRCCOPY) BitBlt_(hdcTemp, 0, 0, ptSize\x, ptSize\y, hdcSave, 0, 0, #SRCCOPY) DeleteObject_(SelectObject_(hdcBack, bmBackOld)) DeleteObject_(SelectObject_(hdcObject, bmObjectOld)) DeleteObject_(SelectObject_(hdcMem, bmMemOld)) DeleteObject_(SelectObject_(hdcSave, bmSaveOld)) DeleteDC_(hdcMem) DeleteDC_(hdcBack) DeleteDC_(hdcObject) DeleteDC_(hdcSave) DeleteDC_(hdcTemp) EndProcedure
sans avoir étudié le code, je pense que la fonction dessine sur le hdc (hdc = stardrawing(imageid(id)) passé en paramètre le bitmap passé en paramètre par hBitmap (le handle du bitmap) aux coordonnées xStart, yStart (souvent 0 et 0 qui corresond à l'angle supérieur gauche) en appliquant la transparence pour la couleur ayant la valeur TransColor (chaque pixel ayant cette couleur) mais comme je n'ai pas regardé, je ne sais pas si c'est une transparence complète ou si la transparence partielle est supportée.
Si vous faites un truc pour vous, pas de problème mais si vous écrivez une lib ou une application, il faut impérativement tester le résultat des APi car elle peuvent échouer et là on crash. C'est à ce prix que le code est stable.
A+
Denis