image alpha

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

image alpha

Message par blendman »

salut

Voici un petit programme tout simple pour créer 1 image avec un canal d'après une autre image.

Code : Tout sélectionner




UsePNGImageDecoder()
UsePNGImageEncoder()
UseJPEGImageDecoder()
UseGIFImageDecoder()



Global Dim Image$(0)
Global iAlpha, iDiffuse, iResult

iAlpha    = 0
iDiffuse  = 1
iResult   = 2


Enumeration 
  
  #g_panelleft
  #G_imagediffuse
  #G_imageAlpha
  #G_Update
  #G_save
  
  
  
  #g_canvas
  
EndEnumeration



Procedure UpdateFolder()
  
  n = -1
  ; pour mettre à jour les répertoires d'images
  If ExamineDirectory(0,"media","*.*")
    
    While NextDirectoryEntry(0)
      
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        n +1
        
        ReDim Image$(n)
        Image$(n) = DirectoryEntryName(0)
      Else
      EndIf
      
    Wend
    FinishDirectory(0)
  EndIf
  
  ClearGadgetItems(#G_imagediffuse)
  ClearGadgetItems(#G_imageAlpha)
  
  
  For i=0 To ArraySize(Image$())
    
    AddGadgetItem(#G_imagediffuse, i, Image$(i))
    AddGadgetItem(#G_imageAlpha, i, Image$(i))
    
  Next
  
  
  SetGadgetState(#G_imagediffuse,0)
  SetGadgetState(#G_imageAlpha,0)
  
EndProcedure

Procedure CreateAlphaFromDiffuse(X, Y, CouleurSource, CouleurCible)
  
  ;  modifie l'alpha en fonction des autres couleur 
  alpha = RGB(Red(CouleurCible), Green(CouleurCible), Blue(CouleurCible))
  ProcedureReturn RGBA(Red(CouleurSource), Green(CouleurSource), Blue(CouleurSource), alpha)
  
EndProcedure



Procedure SaveImgCAnvas()
  
  Shared Id
  ;   img1 = GetGadgetAttribute(#g_canvas, #PB_Canvas_Image)
  ;   
  ;   
  ;   img = CreateImage(#PB_Any, ImageWidth(iAlpha), ImageHeight(iAlpha),32)
  ;   
  ;   If StartDrawing(ImageOutput(img))
  ;     DrawingMode(#PB_2DDrawing_AlphaChannel)
  ;     Box(0,0,OutputWidth(),OutputHeight(),RGBA(0,0,0,0))
  ;     DrawingMode(#PB_2DDrawing_AlphaBlend)
  ;     DrawAlphaImage(img1,0,0)
  ;     StopDrawing()
  ;   EndIf
  
  
  id +1
  ;SaveImage(img, "image"+Str(id)+".png", #PB_ImagePlugin_PNG)
  
  SaveImage(iResult, "image"+Str(id)+".png", #PB_ImagePlugin_PNG,7,32)
  
  ;   FreeImage(img)
  
EndProcedure


Procedure UpdateCanvas(ok = 0)
  
  
  ; pour mettre à jour le canvas
  ImgDiffuseID = GetGadgetState(#G_imagediffuse)
  ImgAlphaID = GetGadgetState(#G_imageAlpha)
  
  If ImgDiffuseID <0
    ImgDiffuseID = 0
  ElseIf ImgDiffuseID > ArraySize(Image$())
    ImgDiffuseID = ArraySize(Image$())
  EndIf
  
  If ImgAlphaID <0
    ImgAlphaID = 0
  ElseIf ImgAlphaID > ArraySize(Image$())
    ImgAlphaID = ArraySize(Image$())
  EndIf
  
  
  
  ImgDiffuse$ = GetGadgetItemText(#G_imagediffuse, ImgDiffuseID )
  ImgAlpha$ = GetGadgetItemText(#G_imageAlpha, ImgAlphaID)
  
  If ImgDiffuse$ <> "" And ImgAlpha$ <> ""
    
    ; je supprime les ancienne image
    If IsImage(iAlpha)
      FreeImage(iAlpha)
    EndIf
    
    If IsImage(iDiffuse)
      FreeImage(iDiffuse)
    EndIf
    
    ; je load les nouvelles images
    ;Debug Image$(ImgDiffuseID)
    ;Debug Image$(ImgAlphaID)
    
    LoadImage(iAlpha, "media\"+Image$(ImgAlphaID))
    LoadImage(iDiffuse, "media\"+Image$(ImgDiffuseID))
    
    
    
    
    ; je crée l'image pour le résultat
    If IsImage(iResult)
      FreeImage(iResult)
    EndIf
    
    CopyImage(iAlpha, iResult)
    
    
    ; je crée le résultat
    If StartDrawing(ImageOutput(iResult))
      
      DrawingMode(#PB_2DDrawing_AllChannels)
      Box(0,0,OutputWidth(),OutputHeight(),RGBA(0,0,0,0)) 
      
      DrawingMode(#PB_2DDrawing_CustomFilter)
      CustomFilterCallback(@CreateAlphaFromDiffuse())
      DrawAlphaImage(ImageID(iAlpha),0,0)
      
      ; DrawingMode(#PB_2DDrawing_AlphaClip|#PB_2DDrawing_AlphaBlend)
      DrawAlphaImage(ImageID(iDiffuse),0,0)
      StopDrawing()
    EndIf
    
    If ok = 1
      SaveImgCAnvas()
    EndIf
    
    ; mise à jour du canvas
    If StartDrawing(CanvasOutput(#g_canvas))
      
      Box(0,0,OutputWidth(),OutputHeight(),RGB(150,150,150))
      DrawingMode(#PB_2DDrawing_AlphaBlend)
      DrawAlphaImage(ImageID(iResult),0,0)
      
      
      StopDrawing()
    EndIf
    
  EndIf
  
EndProcedure






w = 800
h = 600

If OpenWindow(0, 0, 0, w, h, "create image from...", 
              #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_Maximize)
  
  x = 5
  w = 200
  y = 10
  h = WindowHeight(0)
  u = 20
  
  PanelGadget(#g_panelleft, 0, y, w, h-5-y)
  AddGadgetItem(#g_panelleft, 0, "general")
  
  
  ComboBoxGadget(#G_imagediffuse, x, y, w-x-15, u) : y + u+5
  GadgetToolTip(#G_imagediffuse, "Couleur de l'Image")
  
  ComboBoxGadget(#G_imageAlpha, x, y, w-x-15, u) : y + u+5
  GadgetToolTip(#G_imageAlpha, "Alpha de l'Image")
  
  
  ButtonGadget(#G_Update, x, y, 100, u, "Update Folder") : y + u+5
  ButtonGadget(#G_save, x, y, 100, u, "Save image") : y + u+5
  
  UpdateFolder()  
  
  CloseGadgetList()
  
  y = 10
  CanvasGadget(#g_canvas, w+5, y, WindowWidth(0)-x-10, h-5-y, #PB_Canvas_Border)
  
  
  
  UpdateCanvas()
  
  
  Repeat
    Event = WaitWindowEvent()
    
    Select Event
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #G_Update 
            UpdateFolder() 
            
          Case #G_imagediffuse, #G_imageAlpha
            ok = 0
            If EventGadget() = #G_imageAlpha
              ok = 1
            EndIf            
            UpdateCanvas(ok)
            
          Case #G_save
            SaveImgCAnvas()
            
        EndSelect
        
    EndSelect
    
  Until Event = #PB_Event_CloseWindow
  
  
  
EndIf