récupérer l'alpha d'une image

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

récupérer l'alpha d'une image

Message par blendman »

salut

savez-vous s'il y a moyen de récupérer la couche alpha d'une image ?

Je suis parti du tutoriel de G-rom, et j'ai essayé de l'adapter, mais je n'ai pas encore réussi :)

Code : Tout sélectionner

UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()

Image_A = LoadImage(#PB_Any,"1.jpg")
Image_B = LoadImage(#PB_Any,"2.png")
alpha_b = LoadImage(#PB_Any,"2.png")

Reference_SizeX = ImageWidth(Image_a)
Reference_SizeY = ImageHeight(Image_a)

ResizeImage(Image_A,Reference_SizeX,Reference_SizeY)
ResizeImage(Image_B,Reference_SizeX,Reference_SizeY)
ResizeImage(alpha_b,Reference_SizeX,Reference_SizeY)

Dim Image_A_Color(Reference_SizeX,Reference_SizeY)
Dim Image_B_Color(Reference_SizeX,Reference_SizeY)
Dim Image_C_Color(Reference_SizeX,Reference_SizeY)

StartDrawing(ImageOutput(Image_A))
  For y = 0 To Reference_SizeY - 1
    For x = 0 To Reference_SizeX - 1
      Image_A_Color(x,y) = Point(x,y)
    Next
  Next
StopDrawing()
 
StartDrawing(ImageOutput(Image_B))
  For y = 0 To Reference_SizeY - 1
    For x = 0 To Reference_SizeX - 1
      Image_B_Color(x,y) = Point(x,y)
    Next
  Next
  StopDrawing()
  
 StartDrawing(ImageOutput(alpha_b))
  For y = 0 To Reference_SizeY - 1
    For x = 0 To Reference_SizeX - 1
      Color = Point(x,y)
      Image_C_Color(x,y) = Alpha(color)
      ;Image_C_Color(x,y) = (Red(Color) + Green(Color) + Blue(Color) ) / 3
    Next
  Next
StopDrawing()  
 
Sortie  = CreateImage(#PB_Any,Reference_SizeX,Reference_SizeY,32)

StartDrawing(ImageOutput(Sortie))
  For y = 0 To Reference_SizeY - 1
    For x = 0 To Reference_SizeX - 1
     
     
      Red_A     = Red(Image_A_Color(x,y))
      Green_A   = Green(Image_A_Color(x,y))
      Blue_A    = Blue(Image_A_Color(x,y))
     
      Red_B     = Red(Image_B_Color(x,y))
      Green_B   = Green(Image_B_Color(x,y))
      Blue_B    = Blue(Image_B_Color(x,y))

      Value.f   = Image_c_Color(x,y);Image_c_Color(x,y) / 255
      ;      
      
      Red       =  (Red_A *value  ) + (Red_B   * (1-Value))
      Green     =  (Green_A *value) + (Green_B * (1-Value))
      Blue      =  (Blue_A * value ) + (Blue_B  * (1-Value))
      
     
      Plot(x,y,RGBA(Red,Green,Blue,value))

    Next
  Next
  StopDrawing()
 
 
  SaveImage(Sortie,"Sortie.png",#PB_ImagePlugin_PNG,32) 
En fait, j'essaie de créer un système tout simple de calque, donc, j'imagine que cela devrait être possible en utilisant ce tutoriel :)

Merci d'avance ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: récupérer l'alpha d'une image

Message par G-Rom »

Quel tuto ?
sinon tu as la commande Alpha() non?
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: récupérer l'alpha d'une image

Message par blendman »

G-Rom a écrit :Quel tuto ?
celui-ci ;) : http://www.purebasic.fr/french/viewtopi ... 4#p114384/
sinon tu as la commande Alpha() non?
oui, mais je dois mal m'en servir, car ça ne marche pas avec mes quelques changements.

J'ai tenté ça :

Code : Tout sélectionner

StartDrawing(ImageOutput(alpha_b))
  For y = 0 To Reference_SizeY - 1
    For x = 0 To Reference_SizeX - 1
      Image_C_Color(x,y) = Alpha(Point(x,y))
    Next
  Next
StopDrawing()  
mais je ne sais pas pourquoi, je n'obtiens pas ce que je pensais obtenir. il doit y avoir des choses qui m'échappent :)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: récupérer l'alpha d'une image

Message par G-Rom »

As tu dessiner la couche alpha d'abord ?
*Ptr = CreateImage(#PB_Any,64,64,32)

StartDrawing(ImageOutput(*Ptr))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,64,64,RGBA(0,0,0,0))

DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle(32,32,24,RGBA(255,0,0,128))
StopDrawing()

UsePNGImageEncoder()
SaveImage(*Ptr,"/home/jerome/Bureau/MonImage.png",#PB_ImagePlugin_PNG)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: récupérer l'alpha d'une image

Message par blendman »

G-Rom a écrit :As tu dessiner la couche alpha d'abord ?
J'ai essayé comme ça aussi, mais ça ne marche pas correctement non plus.

Il doit me manquer des informations :).

En fait, j'ai 2 images en png (avec canal alpha), je les loade et j'essaie de les afficher l'une au dessus de l'autre tout simplement, et d'enregistrer ce résultat.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: récupérer l'alpha d'une image

Message par G-Rom »

Il faut que tu passes par 3 tableaux de la taille de tes images.
Dans les 2 premiers tu colles tes images, dans le 3° tu colle d'abord le 1° puis le second , pas trop difficile à faire ;)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: récupérer l'alpha d'une image

Message par G-Rom »

Il te faut 2 images de même taille , j'utilise les pointeurs dans ce cas , ca fonctionne :

Code : Tout sélectionner

UsePNGImageDecoder()


*Img1 = LoadImage(#PB_Any,"/home/jerome/Bureau/01.png")
*Img2 = LoadImage(#PB_Any,"/home/jerome/Bureau/02.png")


; On alloue la mémoire pour le stockage des 2 images 
*Pixel_IMG_A.i = AllocateMemory( ImageWidth(*Img1) * ImageHeight(*Img1) * 4 )
*Pixel_IMG_B.i = AllocateMemory( ImageWidth(*Img2) * ImageHeight(*Img2) * 4 )


; On copie les pixels
StartDrawing(ImageOutput(*Img1))
DrawingMode(#PB_2DDrawing_AlphaBlend)
  For y = 0 To ImageHeight(*Img1) - 1
    For x = 0 To ImageWidth(*Img1) - 1
      color.i = Point(x,y)
      r.c = Red(color)
      g.c = Green(color)
      b.c = Blue(color)
      a.c = Alpha(color)
      PokeC((*Pixel_IMG_A + (x*4) + ImageWidth(*Img1) * (y*4)) + 0, r)
      PokeC((*Pixel_IMG_A + (x*4) + ImageWidth(*Img1) * (y*4)) + 1, g)
      PokeC((*Pixel_IMG_A + (x*4) + ImageWidth(*Img1) * (y*4)) + 2, b)
      PokeC((*Pixel_IMG_A + (x*4) + ImageWidth(*Img1) * (y*4)) + 3, a)
    Next
  Next
StopDrawing()
  
  
; On copie les pixels
StartDrawing(ImageOutput(*Img2))
DrawingMode(#PB_2DDrawing_AlphaBlend)
  For y = 0 To ImageHeight(*Img2) - 1
    For x = 0 To ImageWidth(*Img2) - 1
      color.i = Point(x,y)
      r.c = Red(color)
      g.c = Green(color)
      b.c = Blue(color)
      a.c = Alpha(color)
      PokeC((*Pixel_IMG_B + (x*4) + ImageWidth(*Img2) * (y*4)) + 0, r)
      PokeC((*Pixel_IMG_B + (x*4) + ImageWidth(*Img2) * (y*4)) + 1, g)
      PokeC((*Pixel_IMG_B + (x*4) + ImageWidth(*Img2) * (y*4)) + 2, b)
      PokeC((*Pixel_IMG_B + (x*4) + ImageWidth(*Img2) * (y*4)) + 3, a)
    Next
  Next
StopDrawing()
  


;On creer la 3° image
out = CreateImage(#PB_Any,ImageWidth(*Img1) , ImageHeight(*Img1),32)

StartDrawing(ImageOutput(out))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,ImageWidth(*Img1),ImageHeight(*Img1),$00000000)
DrawingMode(#PB_2DDrawing_AlphaBlend)
  For y = 0 To ImageHeight(*Img1) - 1
    For x = 0 To ImageWidth(*Img1) - 1
      
      ; on mélange les couleurs ( on les additionnes )
      r.c = PeekC((*Pixel_IMG_A + (x*4) + ImageWidth(*Img1) * (y*4)) + 0) + PeekC((*Pixel_IMG_B + (x*4) + ImageWidth(*Img1) * (y*4)) + 0)
      g.c = PeekC((*Pixel_IMG_A + (x*4) + ImageWidth(*Img1) * (y*4)) + 1) + PeekC((*Pixel_IMG_B + (x*4) + ImageWidth(*Img1) * (y*4)) + 1)
      b.c = PeekC((*Pixel_IMG_A + (x*4) + ImageWidth(*Img1) * (y*4)) + 2) + PeekC((*Pixel_IMG_B + (x*4) + ImageWidth(*Img1) * (y*4)) + 2)
      a.c = PeekC((*Pixel_IMG_A + (x*4) + ImageWidth(*Img1) * (y*4)) + 3) + PeekC((*Pixel_IMG_B + (x*4) + ImageWidth(*Img1) * (y*4)) + 3)
      
      ; On évite la saturation ( 2 pixels à 255 ne peuvent devenir à 512 )
      If r>255 : r=255 : EndIf
      If g>255 : g=255 : EndIf
      If b>255 : b=255 : EndIf
      If a>255 : a=255 : EndIf
      
      ; on plote...
      Plot(x,y,RGBA(r,g,b,a))
      
      
    Next
  Next
StopDrawing()

; on sauve...
UsePNGImageEncoder()
SaveImage(out,"/home/jerome/Bureau/out.png",#PB_ImagePlugin_PNG)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: récupérer l'alpha d'une image

Message par blendman »

Houlà, ben c'est pas simple en fait lol.

J'étais arrivé à à un truc ressemblant à ce résultat (enfin, plus ou moins :)), mais sans les pointeurs et tout le reste :).

cela dit, ce n'est pas tout à fait comme le mode "normal" des calques dans photoshop. Je vais essayé de comprendre ou de trouver plus simple, parce que là... C'est trop compliqué pour moi ;).

merci.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: récupérer l'alpha d'une image

Message par blendman »

Bon, j'ai réussi à faire quelque chose en utilisant une imagegadget :).

Cependant est-ce la bonne méthode pour l'affichage ? Là, je ne récupère pas le canal alpha d'une des images (la 2.png), je ne fais qu'afficher une image au dessus d'une autre , avec la transparence de la 2ème (png)

Le code :

Code : Tout sélectionner

;{ init
If UseJPEGImageDecoder() = 0 Or UsePNGImageDecoder() = 0 Or UseJPEGImageEncoder() = 0 Or UsePNGImageEncoder()=0 Or UseTGAImageDecoder()=0 Or UseTIFFImageDecoder() =0
  MessageRequester("Erreur", "Erreur de chargement des decoder images")
  End
EndIf
;}

;{ variables
Global quit.b, Event

;}

Procedure event_()
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows  
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures  
  GadgetID = EventGadget() ; Is it a gadget event?  
  EventType = EventType() ; The event type
  
  Select Event
    Case #PB_Event_CloseWindow
      quit=1  
  EndSelect  
EndProcedure

Procedure open_win()
  If OpenWindow(0, 0,0, 400,400, "Layer test",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_WindowCentered)
    SmartWindowRefresh(0,1)   
      
    LoadImage(0,"1.jpg")
    LoadImage(1,"2.png")
    CreateImage(2,200,200)
    
    ResizeImage(0,200,200)
    ResizeImage(1,200,200)
    
    
    StartDrawing(ImageOutput(2))
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0,0,50,50,RGBA(15,15,15,255))
    DrawingMode(#PB_2DDrawing_Default)
    Box(0,0,50,50,RGBA(125,125,125,0))
    DrawingMode(#PB_2DDrawing_AlphaBlend)    
    DrawImage(ImageID(0),0,0)
    DrawImage(ImageID(1),0,0)
    StopDrawing() 
    
    ImageGadget(0, 10,10,200,200, ImageID(2),#PB_Image_Border|#PB_Image_Smooth) 
  EndIf  
EndProcedure


open_win()
SaveImage(2,"save_newlayer.jpg")
Repeat
  event_()  
Until quit = 1 Or Event = #PB_Event_CloseWindow

End
les images pour tester :

Image
Image

Maintenant, je me demande si ce n'est pas mieux d'utiliser autre chose.

Qu'en pensez-vous ?

je peux utiliser ce système pour la création de calques par exemple ? :D
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: récupérer l'alpha d'une image

Message par kernadec »

bonsoir blendman
tu n'as pas crée une image 2 avec l'option alpha, j'ai pas tout suivi?
et tu n'utilise pas DrawAlphaImage(), j'ai essayé de voir ce que ça donne pour le fun :lol:

Cordialement

Code : Tout sélectionner

Global quit.b, Event

;}

Procedure event_()
	Event = WaitWindowEvent() ; This line waits until an event is received from Windows  
	WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures  
	GadgetID = EventGadget() ; Is it a gadget event?  
	EventType = EventType() ; The event type
	
	Select Event
		Case #PB_Event_CloseWindow
			quit=1  
	EndSelect  
EndProcedure

Procedure open_win()
	If OpenWindow(0, 0,0, 400,400, "Layer test",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_WindowCentered)
		SmartWindowRefresh(0,1)   
			
		LoadImage(0,"1.jpg")
		LoadImage(1,"2.png")
		CreateImage(2,200,200,32)
		
		ResizeImage(0,200,200)
		ResizeImage(1,200,200)
		
		
		StartDrawing(ImageOutput(2))
		DrawingMode(#PB_2DDrawing_AlphaChannel)
		Box(0,0,50,50,RGBA(15,15,15,255))
		DrawingMode(#PB_2DDrawing_Default)
		Box(0,0,50,50,RGBA(125,125,125,0))
		DrawingMode(#PB_2DDrawing_AlphaBlend)    
		DrawAlphaImage(ImageID(0),0,0,150)
		DrawAlphaImage(ImageID(1),0,0,70)
		StopDrawing() 
		
		ImageGadget(0, 10,10,200,200, ImageID(2),#PB_Image_Border|#PB_Image_Smooth) 
	EndIf  
EndProcedure


open_win()
SaveImage(2,"save_newlayer.jpg")
Repeat
	event_()  
Until quit = 1 Or Event = #PB_Event_CloseWindow

End
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: récupérer l'alpha d'une image

Message par blendman »

salut

En fait, si j'avais testé avec drawAlphaImage() et c'est nickel pour gérer l'opacité des calques, par exemple :).

J'ai ajouté le zoom (je l'ai trouvé sur l'un de tes sujets ou sur un post de sph (réponse de Falsam je crois bien) et le fait de changer l'alpha du calque (le 2 uniquement pour l'instant, mais ça marche pour ceux qu'on veut).

le code :

Code : Tout sélectionner

Enumeration
  #Kbd_Add
  #Kbd_Subtract
  #kbd_up
  #kbd_down
EndEnumeration

;{ init
If UseJPEGImageDecoder() = 0 Or UsePNGImageDecoder() = 0 Or UseJPEGImageEncoder() = 0 Or UsePNGImageEncoder()=0 Or UseTGAImageDecoder()=0 Or UseTIFFImageDecoder() =0
  MessageRequester("Erreur", "Erreur de chargement des decoder images")
  End
EndIf
;}

;{ variables
Global quit.b, Event, size = 200, alpha_layer2.a=255
;}

Declare resizepicture()

Procedure event_()
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows  
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures  
  GadgetID = EventGadget() ; Is it a gadget event?  
  EventType = EventType() ; The event type
  
  Select Event
    Case #PB_Event_CloseWindow
      quit=1        
      
    Case #PB_Event_Menu
      Select EventMenu()
          
        Case #Kbd_Add          
          size + 50
          resizepicture()
          
        Case #Kbd_Subtract          
          If size > 50
            size - 50
            resizepicture()  
          EndIf
          
        Case #Kbd_up         
          If alpha_layer2<255
            alpha_layer2 +1
            resizepicture()
          EndIf
          SetWindowTitle(0,"Layer test - Alpha = "+Str(alpha_layer2))
          
        Case #kbd_down        
          If alpha_layer2>1
            alpha_layer2 -1
            resizepicture()
          EndIf   
          SetWindowTitle(0,"Layer test - Alpha = "+Str(alpha_layer2))
      EndSelect
      
  EndSelect
  
  
EndProcedure

Procedure open_win()
  If OpenWindow(0, 0,0, 400,400, "Layer test",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_WindowCentered)
    SmartWindowRefresh(0,1)   
    
    LoadImage(0,"1.jpg")
    LoadImage(1,"2.png")
    CreateImage(2,800,800)
    CopyImage(1,3)
    
    AddKeyboardShortcut(0, #PB_Shortcut_Add, #Kbd_Add)
    AddKeyboardShortcut(0, #PB_Shortcut_Subtract, #Kbd_Subtract)
    AddKeyboardShortcut(0, #PB_Shortcut_Up, #Kbd_up)
    AddKeyboardShortcut(0, #PB_Shortcut_Down, #Kbd_down)
    
    ImageGadget(0, 0,0,size,size, ImageID(2),#PB_Image_Border|#PB_Image_Smooth) 
    resizepicture()  
  EndIf  
EndProcedure

Procedure resizepicture()
  CopyImage(1,3)
  ResizeImage(3,size,size)
  CopyImage(0,4)
  ResizeImage(4,size,size)
  CopyImage(2,5)
  ResizeImage(5,size,size)
  StartDrawing(ImageOutput(5))
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  Box(0,0,size,size,RGBA(15,15,15,255))
  DrawingMode(#PB_2DDrawing_Default)
  Box(0,0,size,size,RGB(255,255,255))
  DrawingMode(#PB_2DDrawing_AlphaBlend)    
  DrawImage(ImageID(4),0,0)
  DrawAlphaImage(ImageID(3),0,0,alpha_layer2)
  StopDrawing()  
  SetGadgetState(0,ImageID(5))
EndProcedure

open_win()
SaveImage(5,"save_newlayer.jpg")
Repeat
  event_()  
Until quit = 1 Or Event = #PB_Event_CloseWindow

End
d'après toi, on peut afficher tout ça avec un canvas gadget ?
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: récupérer l'alpha d'une image

Message par kwandjeen »

blendman a écrit :

Code : Tout sélectionner

StartDrawing(ImageOutput(alpha_b))
  For y = 0 To Reference_SizeY - 1
    For x = 0 To Reference_SizeX - 1
      Image_C_Color(x,y) = Alpha(Point(x,y))
    Next
  Next
StopDrawing()  
Il manque

Code : Tout sélectionner

DrawingMode(#PB_2DDrawing_AlphaChannel)
dans ton code.
Répondre