recherche code équivalent à DrawAlphaImage

Programmation d'applications complexes
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

recherche code équivalent à DrawAlphaImage

Message par nico »

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.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

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
Dernière modification par Anonyme2 le sam. 29/mars/2008 11:02, modifié 1 fois.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

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
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

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
un bien belle procédure, encore faut-il savoir l'exploiter...

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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

beauregard a écrit :
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
un bien belle procédure, encore faut-il savoir l'exploiter...

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
Salut beauregard,

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
Répondre