PureBasic

Forums PureBasic
Nous sommes le Mar 25/Juin/2019 14:49

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 1 message ] 
Auteur Message
 Sujet du message: image alpha
MessagePosté: Mer 13/Sep/2017 13:26 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 19/Fév/2011 12:46
Messages: 1880
salut

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

Code:



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


_________________
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 1 message ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye