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