Re: OpenGLGadget() Charger une Image.BMP mode Dessin, Zoom,
Publié : mer. 22/oct./2014 11:01
Comment fait-on pour enregistrer l'image sur disque une fois tournée ou zoomée ?
Merci.
M.
Merci.
M.
Forums PureBasic - Français
https://www.purebasic.fr/french/
Code : Tout sélectionner
If OpenWindow(0, 0, 0, 400, 300, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; Auteur: RASHAD -- forum anglais
HideWindow(0,1)
OpenWindow(1, 0, 0,395, 200, "Transparent",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget |#PB_Window_ScreenCentered)
SetParent_(WindowID(0),WindowID(1))
EditorGadget(0, 10, 10, 375, 120)
For a = 0 To 5
AddGadgetItem(0, a, "Line "+Str(a))
Next
SetGadgetColor(0, #PB_Gadget_BackColor,$FFFFFE)
SetWindowLong_(WindowID(1),#GWL_EXSTYLE,GetWindowLong_(WindowID(1),#GWL_EXSTYLE)|#WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(1),$FFFFFE,0,#LWA_COLORKEY)
SetActiveWindow(1)
SetActiveGadget(0)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Code : Tout sélectionner
; ------ exemple de chargement d'image PNG ------
; Ajout affichage d' une image2D avec zoom wheel et rotation key avec dessin sur image kernadec
UsePNGImageDecoder()
#ImagePath = #PB_Compiler_Home + "examples/sources/Data/"
Define ImageHeight.I
Define ImageSize.I
Define ImageWidth.I
Define TextureID.I
ImageId = LoadImage(#PB_Any, #ImagePath + "flare.png") ; mode chargement image.PNG
If IsImage(ImageId)
ImageWidth = ImageWidth(ImageId)
ImageHeight = ImageHeight(ImageId)
Else
End
EndIf
;################# Importation d'une image PNG auteur : DarkDragon #########################
Dim ImageData.b(ImageWidth * ImageHeight * 4)
StartDrawing(ImageOutput(ImageId))
For y = ImageHeight-1 To 0 Step -1
For x = 0 To ImageWidth-1
Color = Point(x, y)
ImageData(i) = Red(Color)
i + 1
ImageData(i) = Green(Color)
i + 1
ImageData(i) = Blue(Color)
i + 1
ImageData(i) = Round((Red(Color) * 0.3) + (Green(Color) * 0.584) + (Blue(Color) * 0.114), #PB_Round_Nearest)
i + 1
Next
Next
StopDrawing()
FreeImage(ImageId)
glGenTextures_(1, @TextureID)
If TextureFilter = 0
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST)
glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData())
ElseIf TextureFilter = 1
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData())
ElseIf TextureFilter = 2
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_NEAREST)
gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, ImageWidth, ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData())
ElseIf TextureFilter = 3
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_LINEAR)
gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, ImageWidth, ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData())
EndIf
;############################################################################################
Procedure affiche(z.f,ang.d,TextureID)
; ----- suite procedure affiche kernadec
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT | #GL_STENCIL_BUFFER_BIT);
glLoadIdentity_()
glPushMatrix_()
;//initialisation de la transparence
glEnable_(#GL_BLEND);
; //la couleur de l'objet va être (1-alpha_de_l_objet) * couleur du fond et (le_reste * couleur originale)
glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA);
glEnable_(#GL_TEXTURE_2D);
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTranslatef_(GadgetWidth(0) / 2, GadgetWidth(0) / 2, 0.0) ; centre l'image
glRotatef_(ang, 0.0, 0.0, 1.0) ; angle de l'image
glNormal3f_( 0.0, 0.0, 1.0)
glScalef_(z, z, 1.0) ; zoom objets
Xechelle.d = GadgetWidth(0) / 2
Yechelle.d = GadgetWidth(0) / 2
glBegin_(#GL_QUADS) ; dessin et mise à l' échelle de la texture
; glColor3f_(0, 0.35, 0.5) ; ajout de couleur
glTexCoord2f_(0.0, 0.0): glVertex3f_(-Xechelle, -Yechelle, 1.0) ; Bas Gauche depuis le centre
glTexCoord2f_(1.0, 0.0): glVertex3f_( Xechelle, -Yechelle, 1.0) ; Bas Droit "
glTexCoord2f_(1.0, 1.0): glVertex3f_( Xechelle, Yechelle, 1.0) ; Haut Droit "
glTexCoord2f_(0.0, 1.0): glVertex3f_(-Xechelle, Yechelle, 1.0) ; haut Gauche "
glDisable_(#GL_BLEND) ; //on désactive la transparence
glPopMatrix_() ;
glEnd_() ;
;SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True) ; affiche l'image
EndProcedure
If OpenWindow(0, 0, 0, 320, 320, "PNG to OpenGLGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) = 0
End
EndIf
OpenGLGadget(0, 10, 10, 300, 300, #PB_OpenGL_Keyboard)
glDrawBuffer_(#GL_FRONT_AND_BACK) ; activer avec windows 8 pour éviter le scintillement
; ----- Generate texture exemple Appelpi suite
glGenTextures_(1, @TextureID)
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, ImageData())
; ------ suite kernadec affiche l'image dans l'OpenGLGadget() converti à partir d'un code C++
;
glViewport_(0, 0, GadgetWidth(0), GadgetHeight(0));
glMatrixMode_(#GL_PROJECTION) ;
glLoadIdentity_() ;
glOrtho_(GadgetX(0)-10, GadgetWidth(0) ,GadgetHeight(0),GadgetY(0)-10 , GadgetWidth(0)/2,-GadgetHeight(0)/2) ; Axe de l'OpenGLGadget()
;
glMatrixMode_(#GL_MODELVIEW) ;
glClearColor_(1.0, 1.0, 1.0, 1.0) ;
glEnable_(#GL_DEPTH_TEST);
glDepthMask_(#GL_TRUE) ;
z.f = 0.75
ang.d = 45
SetActiveGadget(0)
affiche(z,ang,TextureID)
FLAG_flip.b = #True
Repeat
event = WaitWindowEvent()
If Event = #PB_Event_Gadget And EventGadget() = 0
If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
x = GetGadgetAttribute(0, #PB_OpenGL_MouseX) ; coordonnées souris
y = GetGadgetAttribute(0, #PB_OpenGL_MouseY)
glDisable_(#GL_TEXTURE_2D) ;
glPopMatrix_() ; la matrice revient a l'état du dernier glPushMatrix()
glEnable_(#GL_POINT_SMOOTH) ; mode point arrondi
glDepthMask_(#GL_FALSE) ; premier plan
glPointSize_(20 * z) ; entrer la taille avant mode dessin
glBegin_(#GL_POINTS) ; mode dessin points
glColor3ub_(Random(255),Random(255),Random(255)) ; couleur
glVertex3f_(x,y,0) ; dessine le points
glEnd_()
glDepthMask_(#GL_TRUE) ; arrière plan
FLAG_flip = #True
EndIf
EndIf
If Event = #PB_Event_Gadget And EventGadget() = 0
If EventType() = #PB_EventType_MouseWheel
glColor3ub_(255,255,255) ; restore la couleur de base en mode zoom
Z + (GetGadgetAttribute(0, #PB_OpenGL_WheelDelta ) /10) ; mode rotation molette souris
affiche(z,ang,TextureID)
FLAG_flip = #True
EndIf
If EventType() = #PB_EventType_KeyDown
glColor3ub_(255,255,255) ; restore la couleur de base en mode zoom key
key = GetGadgetAttribute(0,#PB_OpenGL_Key )
If key = #PB_Shortcut_Right ; flàche droite clavier
ang=Mod(ang - 5,360)
affiche(z,ang,TextureID)
FLAG_flip = #True
ElseIf key = #PB_Shortcut_Left ; flàche gauche clavier
ang=Mod(ang + 5,360)
affiche(z,ang,TextureID)
FLAG_flip = #True
ElseIf key = #PB_Shortcut_Escape ; Esc = End
CloseWindow(0)
End
EndIf
EndIf
EndIf
If FLAG_flip
SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
FLAG_flip = #False
EndIf
Until event = #PB_Event_CloseWindow
En fait, tu ne m'as pas compris, ce n'est pas le gadget que je veux transparent, c'est le résultat, autrement dit : est-il possible d'utiliser des calques (des images ou des sprites) dessus et de récupérer le résultat du canvas opengl sous forme d'image, donc avec la transparenceAu sujet d' OpenGLGadget transparent
Code : Tout sélectionner
ImageData(i) = Round((Red(Color) * 0.3) + (Green(Color) * 0.584) + (Blue(Color) * 0.114), #PB_Round_Nearest)
Code : Tout sélectionner
glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, ImageData())
Code : Tout sélectionner
Dim ImageData.b(ImageWidth * ImageHeight * 4)
if StartDrawing(ImageOutput(ImageId))
DrawingMode(#PB_2DDrawing_AlphaBlend) ; <---------------- ajouter ça
For y = ImageHeight-1 To 0 Step -1
For x = 0 To ImageWidth-1
Color = Point(x, y)
ImageData(i) = Red(Color)
i + 1
ImageData(i) = Green(Color)
i + 1
ImageData(i) = Blue(Color)
i + 1
ImageData(i) = Alpha(color) ;< ------------------------ changer ici
Next
Next
StopDrawing()
endif
Code : Tout sélectionner
;{ Infos
; ------ exemple de chargement d'image PNG ------
; Ajout affichage d' une image2D avec zoom wheel et rotation key avec dessin sur image kernadec
; modification by blendman
;{ ******************** Changes ********************
; 04/06/2015
; - changement zoom + et zoom - (on ne passe plus de l'un à l'autre en dézoomant par exemple)
; - ajout de 2 calques : bug pour le moment
; - on peut déplacer le canvas avec la touche Space
;}
;{ ******************** TODO ********************
;}
;}
;{ Constante
#ImagePath = #PB_Compiler_Home + "examples/sources/Data/"
;}
;{ variables
Define ImageHeight.I
Define ImageSize.I
Define ImageWidth.I
Define TextureID.I
Global Z.f ;zoom
;}
;{ Structures
Structure sLayer
x.w : y.w
ImageWidth.w : ImageHeight.w
ImageId.i
TextureId.i
Name$
Bm.a
View.a
Lock.a
Alpha.a
Array ImageData.b(0)
EndStructure
Global NewList Layer.sLayer()
Structure sCanvas
X.w : Y.w
EndStructure
Global Canvas.sCanvas
;}
;{ init
If UsePNGImageDecoder() And UsePNGImageEncoder() And UsePNGImageEncoder() And UseJPEGImageEncoder() : EndIf
;}
;{ Procedures
Declare DrawCanvas()
; Layer
Procedure ImportImageOnLayer()
Filename$ = OpenFileRequester("Ouvrir une image", "","PNG|*.png", 0)
If Filename$ <> ""
AddElement(Layer())
Layer()\ImageId = LoadImage(#PB_Any,Filename$) ; chargement image.PNG
Else
MessageRequester("Erreur", "vous n'avez pas choisis d'image")
End
EndIf
If IsImage(Layer()\ImageId)
With layer()
\ImageWidth = ImageWidth(Layer()\ImageId)
\ImageHeight = ImageHeight(Layer()\ImageId)
\bm = 0 ; ListSize(layer())
\view = 1
EndWith
;Layer()\TextureId = ListSize(Layer())
Else
End
EndIf
;################# Importation d'une image PNG auteur : DarkDragon #########################
Dim Layer()\ImageData(Layer()\ImageWidth * Layer()\ImageHeight * 4)
If StartDrawing(ImageOutput(layer()\ImageId))
DrawingMode(#PB_2DDrawing_AlphaBlend)
For y = layer()\ImageHeight-1 To 0 Step -1
For x = 0 To layer()\ImageWidth-1
Color = Point(x, y)
layer()\ImageData(i) = Red(Color)
i + 1
layer()\ImageData(i) = Green(Color)
i + 1
layer()\ImageData(i) = Blue(Color)
i + 1
layer()\ImageData(i) = Alpha(color) ; Round((Red(Color) * 0.3) + (Green(Color) * 0.584) + (Blue(Color) * 0.114), #PB_Round_Nearest)
i + 1
Next
Next
StopDrawing()
EndIf
glGenTextures_(2, @Layer()\TextureID)
;############################################################################################
; pour le couleur de bordure de l'image (ne marche pas)
Dim color.f(3)
color(0) = 1
color(1) = 0
color(2) = 0
color(3) = 0
If TextureFilter = 0
glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST)
glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, layer()\ImageWidth, layer()\ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData())
ElseIf TextureFilter = 1
glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, layer()\ImageWidth, layer()\ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData())
ElseIf TextureFilter = 2
glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_NEAREST)
gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, layer()\ImageWidth, layer()\ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData())
ElseIf TextureFilter = 3
glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_LINEAR)
gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, layer()\ImageWidth, layer()\ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData())
EndIf
; tests
;glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_S, #GL_REPEAT)
;glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_T, #GL_REPEAT)
; glTexParameterfv_(#GL_TEXTURE_2D, #GL_TEXTURE_BORDER_COLOR, Color()) ; couleur de la bordure
EndProcedure
Procedure LayerUpdate()
Dim Layer()\ImageData(Layer()\ImageWidth * Layer()\ImageHeight * 4)
If StartDrawing(ImageOutput(layer()\ImageId))
DrawingMode(#PB_2DDrawing_AlphaBlend)
For y = layer()\ImageHeight-1 To 0 Step -1
For x = 0 To layer()\ImageWidth-1
Color = Point(x, y)
layer()\ImageData(i) = Red(Color)
i + 1
layer()\ImageData(i) = Green(Color)
i + 1
layer()\ImageData(i) = Blue(Color)
i + 1
layer()\ImageData(i) = Alpha(color)
i + 1
Next
Next
StopDrawing()
EndIf
; glGenTextures_(2, @Layer()\TextureID)
;############################################################################################
; pour le couleur de bordure de l'image (ne marche pas)
Dim color.f(3)
color(0) = 1
color(1) = 0
color(2) = 0
color(3) = 0
If TextureFilter = 0
glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST)
glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, layer()\ImageWidth, layer()\ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData())
ElseIf TextureFilter = 1
glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, layer()\ImageWidth, layer()\ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData())
ElseIf TextureFilter = 2
glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_NEAREST)
gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, layer()\ImageWidth, layer()\ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData())
ElseIf TextureFilter = 3
glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_LINEAR)
gluBuild2DMipmaps_(#GL_TEXTURE_2D, 3, layer()\ImageWidth, layer()\ImageHeight, #GL_RGBA, #GL_UNSIGNED_BYTE, @layer()\ImageData())
EndIf
; tests
;glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_S, #GL_REPEAT)
;glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_WRAP_T, #GL_REPEAT)
glTexParameterfv_(#GL_TEXTURE_2D, #GL_TEXTURE_BORDER_COLOR, Color()) ; couleur de la bordure
DrawCanvas()
EndProcedure
; affichage
Procedure affiche(z.f,ang.d,w,h,bm=0)
; attention, le W et H, c'est la taille du document. Quand on charge une image, il faut la dessiner sur notre calque avec drawAlphaImage()
; bm = blendmode
; ----- suite procedure affiche kernadec
glLoadIdentity_() ; on doit charger
glPushMatrix_() ; (sauvegarde de la matrice) on reprend là où on en était, pour éviter de cumuler les déplacement d'image par exemple
glDepthMask_(#GL_FALSE) ; on met l'image au premier plan
;//initialisation de la transparence
glEnable_(#GL_BLEND);
; //la couleur de l'objet va être (1-alpha_de_l_objet) * couleur du fond et (le_reste * couleur originale)
; blend mode pour le calque
If bm = 0 ; normal
glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA)
ElseIf bm = 1 ; add
glBlendFunc_(#GL_ONE, #GL_ONE)
EndIf
glEnable_(#GL_TEXTURE_2D);
glBindTexture_(#GL_TEXTURE_2D, Layer()\TextureID)
; ici, ce sont les transformations de l'image
glTranslatef_(GadgetWidth(0)/2+Canvas\X, GadgetHeight(0)/2+Canvas\Y, 0.0) ; ppour déplacer l'image (par exemple, centrer l'image)
glRotatef_(ang, 0.0, 0.0, 1.0) ; angle de l'image
glNormal3f_( 0.0, 0.0, 1.0)
; zoom objets
glScalef_(z, z, 1.0) ; ici, j'ai placé un scale général
Xechelle.d = w ;GadgetWidth(0)/2
Yechelle.d = h ;GadgetHeight(0)/2
glBegin_(#GL_QUADS); dessin et mise à l' échelle de la texture
; glColor3f_(0, 0.35, 0.5) ; ajout de couleur
glTexCoord2f_(0.0, 0.0): glVertex3f_(-Xechelle, Yechelle, 1.0) ; Bas Gauche depuis le centre
glTexCoord2f_(1.0, 0.0): glVertex3f_( Xechelle, Yechelle, 1.0) ; Bas Droit "
glTexCoord2f_(1.0, 1.0): glVertex3f_( Xechelle, -Yechelle, 1.0) ; Haut Droit "
glTexCoord2f_(0.0, 1.0): glVertex3f_(-Xechelle, -Yechelle, 1.0) ; haut Gauche "
; glDisable_(#GL_BLEND) ; //on désactive la transparence
glPopMatrix_()
glEnd_()
glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA);
; glDepthMask_(#GL_TRUE) ; arrière plan
;SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True) ; affiche l'image
EndProcedure
Procedure DrawCanvas()
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT | #GL_STENCIL_BUFFER_BIT); on efface le canvas
glLoadIdentity_()
; ang.d = -90
ForEach layer()
If layer()\View
affiche(z,ang,1024,768,layer()\bm)
EndIf
Next
glEnd_() ; on arrête car on a terminé
EndProcedure
;}
; on importe 2 images (soit 2 calques) pour tester
ImportImageOnLayer()
;{ window
ExamineDesktops()
WinW= DesktopWidth(0)
WinH= DesktopHeight(0)
If OpenWindow(0, 0, 0, WinW, WinH, "PNG to OpenGLGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_Maximize) = 0
End
EndIf
OpenGLGadget(0, 10, 10, WinW-20, WinH-70, #PB_OpenGL_Keyboard)
glDrawBuffer_(#GL_FRONT_AND_BACK); activer avec windows 8 pour éviter le scintillement
; ----- Generate texture exemple Appelpi suite
ForEach layer()
glGenTextures_(2, @layer()\TextureID) ; on spécifie deux textures à créer, dans l'array LAyer()\textureID
glBindTexture_(#GL_TEXTURE_2D, layer()\TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, layer()\ImageWidth, layer()\ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, layer()\ImageData())
Next
; ------ suite kernadec affiche l'image dans l'OpenGLGadget() converti à partir d'un code C++
;
glViewport_(0, 0, GadgetWidth(0), GadgetHeight(0));
glMatrixMode_(#GL_PROJECTION) ;
glLoadIdentity_() ;
glOrtho_(GadgetX(0), GadgetWidth(0) ,GadgetHeight(0),GadgetY(0), GadgetWidth(0)/2,-GadgetHeight(0)/2) ; Axe de l'OpenGLGadget()
;
glMatrixMode_(#GL_MODELVIEW) ;
glClearColor_(0.5,0.5,0.5,1.0) ;
; glEnable_(#GL_DEPTH_TEST);
glDepthMask_(#GL_TRUE) ;
z.f = 0.5
SetActiveGadget(0)
DrawCanvas()
FLAG_flip.b = #True
;}
Repeat ; Loop
event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
Case 0
Debug GadgetHeight(0)/2
x = GetGadgetAttribute(0, #PB_OpenGL_MouseX)
y = GetGadgetAttribute(0, #PB_OpenGL_MouseY)
;x1 = (0.5/z)*x - (GadgetWidth(0)/2 - 1024/2) - (canvas\x)
Gx = (GadgetWidth(0) - 1024)/2
Gy = (GadgetHeight(0) - 768)/2
x1 = (0.5/z)*x -Gx - (canvas\x)
y1 = (0.5/z)*y -Gy - (canvas\y)
tx$="x1/y1: "+Str(x1)+"/"+Str(y1)+" #x/y: "+Str((0.5/z)*x)+"/"+Str((0.5/z)*y)+" # "+Str(Gx)+" /Z :"+StrF(z)+" #Canvas:"+Str(canvas\x)+"/"+Str(canvas\y)
SetWindowTitle(0,tx$)
If EventType() = #PB_EventType_KeyDown
; glColor3ub_(255,255,255) ; restore la couleur de base en mode zoom key
key = GetGadgetAttribute(0,#PB_OpenGL_Key)
If key = #PB_Shortcut_Space
space= 1
EndIf
If key = #PB_Shortcut_Right ; flàche droite clavier
ang=Mod(ang - 5,360)
DrawCanvas()
FLAG_flip = #True
ElseIf key = #PB_Shortcut_Left ; flàche gauche clavier
ang=Mod(ang + 5,360)
DrawCanvas()
FLAG_flip = #True
ElseIf key = #PB_Shortcut_Escape ; Esc = End
CloseWindow(0)
End
EndIf
EndIf
If EventType() = #PB_EventType_KeyUp
key = GetGadgetAttribute(0,#PB_OpenGL_Key)
If key = #PB_Shortcut_Space
space= 0
EndIf
EndIf
If EventType() = #PB_EventType_LeftButtonUp
OldX = Canvas\X
OldY = Canvas\Y
FLAG_flip = #True
LayerUpdate()
EndIf
If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
If Space= 0
If StartDrawing(ImageOutput(layer()\ImageId))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle(x1,y1,10,RGBA(255,255,255,255))
StopDrawing()
EndIf
; puis, on l'update
; LayerUpdate()
; affichage sur le canvas, pour le tps réel
;{ on dessine directement sur le canvasopenGL
glDisable_(#GL_TEXTURE_2D) ;
glPopMatrix_() ; la matrice revient a l'état du dernier glPushMatrix()
glEnable_(#GL_POINT_SMOOTH) ; mode point arrondi
glDepthMask_(#GL_FALSE) ; premier plan
glPointSize_(40 * z) ; entrer la taille avant mode dessin
glBegin_(#GL_POINTS) ; mode dessin points
; glColor3ub_(Random(255),Random(255),Random(255)) ; couleur
glVertex3f_(x,y,0) ; dessine le points
glEnd_()
glDepthMask_(#GL_TRUE) ; arrière plan
;}
Else
If EventType() = #PB_EventType_LeftButtonDown
startX = x - OldX
StartY = y - OldY
EndIf
Canvas\X = x - StartX
Canvas\Y = y - StartY
DrawCanvas()
EndIf
FLAG_flip = #True
;
EndIf
If EventType() = #PB_EventType_MouseWheel
g = GetGadgetAttribute(0, #PB_OpenGL_WheelDelta )
If G > 0
If Z < 3
glColor3ub_(255,255,255) ; restore la couleur de base en mode zoom
Z + 0.1 ; mode rotation molette souris
DrawCanvas()
EndIf
ElseIf G<0
If Z > 0.1
glColor3ub_(255,255,255) ; restore la couleur de base en mode zoom
Z -0.1 ; mode rotation molette souris
DrawCanvas()
EndIf
EndIf
FLAG_flip = #True
EndIf
EndSelect
EndIf
If FLAG_flip
SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
FLAG_flip = #False
EndIf
Until event = #PB_Event_CloseWindow
Code : Tout sélectionner
; ------ exemple de chargement d'image Applepi forum englais
; Ajout affichage d' une image2D avec zoom wheel et rotation key avec dessin sur image kernadec
UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
#ImagePath = #PB_Compiler_Home + "examples/sources/Data/"
Define *BMPHeader
Define *BMPImage
Define ImageHeight.I
Define ImageSize.I
Define ImageWidth.I
Define TextureID.I
If ReadFile(0, #ImagePath + "Geebee2.bmp") = 0
MessageRequester("Error", "Loading of texture image failed!")
End
EndIf
*BMPHeader = AllocateMemory(54)
ReadData(0, *BMPHeader, MemorySize(*BMPHeader))
ImageWidth = PeekL(*BMPHeader + 18)
ImageHeight = PeekL(*BMPHeader + 22)
ImageSize = PeekL(*BMPHeader + 34)
FreeMemory(*BMPHeader)
*BMPImage = AllocateMemory(ImageSize)
ReadData(0, *BMPImage, ImageSize)
CloseFile(0)
; --------
Procedure affiche(z.f,ang.d,TextureID)
; ----- suite procedure affiche kernadec
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT);
glLoadIdentity_() ;
glPushMatrix_()
glEnable_(#GL_TEXTURE_2D);
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTranslatef_(GadgetWidth(0) / 2, GadgetWidth(0) / 2, 0.0) ; centre l'image
glRotatef_(ang, 0.0, 0.0, 1.0) ; angle de l'image
glNormal3f_( 0.0, 0.0, 1.0)
glScalef_(z, z, 1.0) ; zoom objets
Xechelle.d = GadgetWidth(0) / 2
Yechelle.d = GadgetWidth(0) / 2
glBegin_(#GL_QUADS) ; dessin et mise à l' échelle de la texture
; glColor3f_(0, 0.35, 0.5) ; ajout de couleur
glTexCoord2f_(0.0, 0.0): glVertex3f_(-Xechelle, -Yechelle, 1.0) ; Bas Gauche depuis le centre
glTexCoord2f_(1.0, 0.0): glVertex3f_( Xechelle, -Yechelle, 1.0) ; Bas Droit "
glTexCoord2f_(1.0, 1.0): glVertex3f_( Xechelle, Yechelle, 1.0) ; Haut Droit "
glTexCoord2f_(0.0, 1.0): glVertex3f_(-Xechelle, Yechelle, 1.0) ; haut Gauche "
glEnd_() ;
SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True) ; affiche l'image
EndProcedure
If OpenWindow(0, 0, 0, 940, 320, "BMP to OpenGLGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenGLGadget(0, 10, 10, ImageWidth, ImageHeight, #PB_OpenGL_Keyboard)
LoadImage(1,#ImagePath + "Geebee2.bmp")
ButtonGadget(1,GadgetX(0)+GadgetWidth(0)+10,10,90,30,"Save")
ImageGadget(2,GadgetX(1)+GadgetWidth(1)+10,10,300,300,ImageID(1),#PB_Image_Border )
; ----- Generate texture exemple Appelpi suite
glGenTextures_(1, @TextureID)
glBindTexture_(#GL_TEXTURE_2D, TextureID)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexImage2D_(#GL_TEXTURE_2D, 0, 3, ImageWidth, ImageHeight, 0, #GL_BGR_EXT, #GL_UNSIGNED_BYTE, *BMPImage)
FreeMemory(*BMPImage)
; ------ suite kernadec affiche l'image dans l'OpenGLGadget() converti à partir d'un code C++
;
glViewport_(0, 0, GadgetWidth(0), GadgetHeight(0));
glMatrixMode_(#GL_PROJECTION) ;
glLoadIdentity_() ;
glOrtho_(GadgetX(0)-10, GadgetWidth(0) ,GadgetHeight(0),GadgetY(0)-10 , GadgetWidth(0)/2,-GadgetHeight(0)/2) ; Axe de l'OpenGLGadget()
;
glMatrixMode_(#GL_MODELVIEW) ;
glClearColor_(1.0, 1.0, 1.0, 1.0) ;
glEnable_(#GL_DEPTH_TEST);
glDepthMask_(#GL_TRUE) ;
z.f = 0.75
ang.d = 45
SetActiveGadget(0)
glDrawBuffer_(#GL_FRONT_AND_BACK) ; activer avec windows 8 pour éviter le scintillement
affiche(z,ang,TextureID)
Repeat
; glReadPixels_(50, 50, 1, 1, #GL_RGB, #GL_UNSIGNED_BYTE, @color)
;
; Debug "Color of the pixel at 50, 50"
; Debug Str(Red(color)) + ", " + Str(Green(color)) + ", " + Str(Blue(color))
; Debug "---"
event = WaitWindowEvent()
gadget = EventGadget()
typeEvent = EventType()
Select Event
Case #PB_Event_Gadget
Select gadget
Case 0 ; opengl gadget
;Select typeEvent
If typeEvent = #PB_EventType_LeftButtonDown Or (typeEvent = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
x = GetGadgetAttribute(0, #PB_OpenGL_MouseX) ; coordonnées souris
y = GetGadgetAttribute(0, #PB_OpenGL_MouseY)
glDisable_(#GL_TEXTURE_2D) ;
glPopMatrix_() ; la matrice revient a l'état du dernier glPushMatrix()
glEnable_(#GL_POINT_SMOOTH) ; mode point arrondi
glDepthMask_(#GL_FALSE) ; premier plan
glPointSize_(20 * z) ; entrer la taille avant mode dessin
glBegin_(#GL_POINTS) ; mode dessin points
glColor3ub_(Random(255),Random(255),Random(255)) ; couleur
glVertex3f_(x,y,0) ; dessine le points
glEnd_()
glDepthMask_(#GL_TRUE) ; arrière plan
SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
EndIf
If EventType() = #PB_EventType_MouseWheel
glColor3ub_(255,255,255) ; restore la couleur de base en mode zoom
Z + (GetGadgetAttribute(0, #PB_OpenGL_WheelDelta ) /10) ; mode rotation molette souris
affiche(z,ang,TextureID)
EndIf
If EventType() = #PB_EventType_KeyDown
glColor3ub_(255,255,255) ; restore la couleur de base en mode zoom key
key = GetGadgetAttribute(0,#PB_OpenGL_Key )
If key = #PB_Shortcut_Right ; flèche droite clavier
ang=Mod(ang - 5,360)
affiche(z,ang,TextureID)
ElseIf key = #PB_Shortcut_Left ; flèche gauche clavier
ang=Mod(ang + 5,360)
affiche(z,ang,TextureID)
ElseIf key = #PB_Shortcut_Escape ; Esc = End
CloseWindow(0)
End
EndIf
EndIf
Case 1 ; bouton save
SetActiveGadget(0)
; taille= 3*ImageWidth*ImageHeight*1 ;1=SizeOf(char)
; Pour utiliser le canal alpha (transparence), taille=4*ImageWidth*ImageHeight*1
taille=ImageSize
*save = AllocateMemory(taille)
glPixelStorei_(#GL_PACK_ALIGNMENT,1);
; GL_PACK_ALIGNMENT
; Specifies the alignment requirements For the start
; of each pixel row in memory. The allowable values are 1
; (byte-alignment), 2 (rows aligned To even-numbered
; bytes), 4 (word-alignment), And 8 (rows start on
; double-word boundaries). The initial value is 4.
glReadBuffer_(#GL_FRONT);#GL_BACK
glReadPixels_(0, 0, ImageWidth, ImageHeight, #GL_BGR_EXT, #GL_UNSIGNED_BYTE, *save)
; Si les couleurs sont inversées, changez #GL_BGR_EXT par #GL_RGB
; Pour utiliser le canal alpha (transparence), utilisez #GL_BGRA_EXT ou #GL_RGBA
CreateImage(2,ImageWidth,ImageHeight); Pour utiliser le canal alpha (transparence),CreateImage(2,ImageWidth,ImageHeight,32)
StartDrawing(ImageOutput(2))
*Buffer = DrawingBuffer()
CopyMemory(*save, *Buffer, taille)
StopDrawing()
FreeMemory(*save)
SetGadgetState(2, ImageID(2))
FichierParDefaut$ = "C:\save" ; Répertoire et fichier par défaut
Filtre$ = "BMP (*.bmp)|*.bmp|"
Filtre$ = Filtre$ + "JPG (*.jpg)|*.jpg|"
Filtre$ = Filtre$ + "JPG2000 (*.jpg)|*.jpg|"
Filtre$ = Filtre$ + "PNG (*.png)|*.png|"
Filtre = 0
Fichier$ = SaveFileRequester("Choisissez un fichier à sauvegarder", FichierParDefaut$, Filtre$, Filtre)
Index = SelectedFilePattern()
Select index
Case 0
If GetExtensionPart(LCase(Fichier$)) <> ".bmp"
Fichier$=Fichier$+".bmp"
EndIf
SaveImage(2,Fichier$,#PB_ImagePlugin_BMP)
Case 1
If GetExtensionPart(LCase(Fichier$)) <> ".jpg"
Fichier$=Fichier$+".jpg"
EndIf
SaveImage(2,Fichier$,#PB_ImagePlugin_JPEG)
Case 2
If GetExtensionPart(LCase(Fichier$)) <> ".jpg"
Fichier$=Fichier$+".jpg"
EndIf
SaveImage(2,Fichier$,#PB_ImagePlugin_JPEG2000); 32bits transparence
Case 3
If GetExtensionPart(LCase(Fichier$)) <> ".png"
Fichier$=Fichier$+".png"
EndIf
SaveImage(2,Fichier$,#PB_ImagePlugin_PNG)
Default
EndSelect
; SaveImage(2,"c:\save.bmp")
; RunProgram("c:\save.bmp")
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow
EndIf