OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Rot
Re: OpenGLGadget() Charger une Image.BMP mode Dessin, Zoom,
Comment fait-on pour enregistrer l'image sur disque une fois tournée ou zoomée ?
Merci.
M.
Merci.
M.
Re: OpenGLGadget() Charger une Image.BMP mode Dessin, Zoom,
Bonjour Mesa
Eh ben... j'avais un peu laisser tomber l' OpenGLGadget ces temps-ci
Mais sur ce site en fin de page, ils donnent un exemple pour sauvegarder une texture
en fichier *.Raw probablement.
http://raphaello.univ-fcomte.fr/IG/OpenGL/OpenGL-2.htm
sinon le manuel réf: opengl de mdsn
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Voir aussi avec OpenGL-GLUT
Cordialement
Eh ben... j'avais un peu laisser tomber l' OpenGLGadget ces temps-ci
Mais sur ce site en fin de page, ils donnent un exemple pour sauvegarder une texture
en fichier *.Raw probablement.
http://raphaello.univ-fcomte.fr/IG/OpenGL/OpenGL-2.htm
sinon le manuel réf: opengl de mdsn
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Voir aussi avec OpenGL-GLUT
Cordialement
Re: OpenGLGadget() Charger une Image.BMP mode Dessin, Zoom,
sympa
Et pour charger un png ou un jpg ? Un openGl gadget peut-il être transparent ?
Et pour charger un png ou un jpg ? Un openGl gadget peut-il être transparent ?
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: OpenGLGadget() Charger une Image.BMP mode Dessin, Zoom,
bonsoir blendman
Pour charger des images au format png voir ce lien: http://www.purebasic.fr/german/viewtopi ... =8&t=25547
Au sujet d' OpenGLGadget transparent, il me semble comprendre que tu aimerais avoir un effet comme celui du code ci-dessous, c'est pas gagné avec ce gadget !
de plus pour avoir un mode transparence de la surface dessin de l' OpenGLGadget, eh ben là !!! je ne sais pas si c'est possible sous OpenGL
Et pour terminer, il y a des effets de transparence sur ce site avec des exemples sympa à adapter.
http://rvirtual.free.fr/programmation/OpenGl/Index.htm
Cordialement
Pour charger des images au format png voir ce lien: http://www.purebasic.fr/german/viewtopi ... =8&t=25547
Au sujet d' OpenGLGadget transparent, il me semble comprendre que tu aimerais avoir un effet comme celui du code ci-dessous, c'est pas gagné avec ce gadget !
de plus pour avoir un mode transparence de la surface dessin de l' OpenGLGadget, eh ben là !!! je ne sais pas si c'est possible sous OpenGL
Et pour terminer, il y a des effets de transparence sur ce site avec des exemples sympa à adapter.
http://rvirtual.free.fr/programmation/OpenGl/Index.htm
Cordialement
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
Re: OpenGLGadget() Charger une Image.BMP mode Dessin, Zoom,
bonjour a tous
Voilà j'ai modifié l' exemple de chargement pour avoir une image PNG en texture.
Code adapté à partir de ce lien :http://www.purebasic.fr/german/viewtopi ... =8&t=25547
cordialement
Voilà j'ai modifié l' exemple de chargement pour avoir une image PNG en texture.
Code adapté à partir de ce lien :http://www.purebasic.fr/german/viewtopi ... =8&t=25547
cordialement
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
Dernière modification par kernadec le sam. 29/nov./2014 11:23, modifié 3 fois.
Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro
salut Kernadec
MErci pour ton exemple avec l'image png
MErci pour ton exemple avec l'image png
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 transparence .Au sujet d' OpenGLGadget transparent
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro
bonsoir blendman
OK merci : .. Alors pour répondre à ta question c'est oui probablement,
Mais la solution c'est d'utiliser GLUT le soucis est que cette librairie qui n'est pas OpenSource !!!
donc c'est ennuyeux voilà !!
alors depuis, j'ai laissé tout cela un peu de côté.
A moins que Fred décide de nous concocter deux trois fonctions pour l'accès
aux zones mémoires graphiques la sauvegarde image de l' OpenGLGadget... ce sera peut être pour un NOËL a venir .
Cordialement
OK merci : .. Alors pour répondre à ta question c'est oui probablement,
Mais la solution c'est d'utiliser GLUT le soucis est que cette librairie qui n'est pas OpenSource !!!
donc c'est ennuyeux voilà !!
alors depuis, j'ai laissé tout cela un peu de côté.
A moins que Fred décide de nous concocter deux trois fonctions pour l'accès
aux zones mémoires graphiques la sauvegarde image de l' OpenGLGadget... ce sera peut être pour un NOËL a venir .
Cordialement
Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro
J'ai ouvert un png transparent et ça ne fonctionne pas, on n'a pas vraiment la transparence ^^ (des parties sont transparentes et pas d'autres, en plus ça dépend des png)
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro
bonjour blendman
Désolé, la routine de DatkDragon ne récupère pas automatiquement le taux de transparence d'une image PNG
il à mis des valeurs moyennes par défaut, voir cette ligne de code pour cela !!
il semble que le format alpha soit mieux gérè en changeant le paramètre de table de couleur fixé à 3 dans le code par cette constante #GL_RGBA,
pour la ligne 140 code mis à jour!
ce paramètre change table en fonction des formats compressés (indiqué dans la doc Opengl)
mais avec le code à l'adresse ci-dessous nous pouvons connaitre le type de format PNG
Voir le lien : http://www.purebasic.fr/english/viewtop ... 13&t=37203
Cordialement
Désolé, la routine de DatkDragon ne récupère pas automatiquement le taux de transparence d'une image PNG
il à mis des valeurs moyennes par défaut, voir cette ligne de code pour cela !!
Code : Tout sélectionner
ImageData(i) = Round((Red(Color) * 0.3) + (Green(Color) * 0.584) + (Blue(Color) * 0.114), #PB_Round_Nearest)
pour la ligne 140 code mis à jour!
Code : Tout sélectionner
glTexImage2D_(#GL_TEXTURE_2D, #Null, #GL_RGBA, ImageWidth, ImageHeight, #Null, #GL_RGBA, #GL_UNSIGNED_BYTE, ImageData())
mais avec le code à l'adresse ci-dessous nous pouvons connaitre le type de format PNG
Voir le lien : http://www.purebasic.fr/english/viewtop ... 13&t=37203
Cordialement
Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro
Salut
Je relance ce sujet pour savoir si vous avez avancé sur l'opengl canvas ?
Moi, j'ai testé, mais pour le moment, c'est un peu galère pour faire quoi que ce soit (je n'y connais rien en openGL, mais ce canvas openGl a l'air vraiment intéressant ^^).
Il manque quelques fonctions simples comme DrawImage(), DrawalphaImage() sur l'opengl canvas. Du coup, ça permettrait d'afficher une image (avec transparence) sur ce gadget, comme sur un canvas classique. Et ce serait beaucoup plus simple à utiliser ensuite (on pourrait faire des opérations sur les images et les afficher ensuite).
Sinon, pour ouvrir parfaitement un png, c'était tout simple ^^ :
Je relance ce sujet pour savoir si vous avez avancé sur l'opengl canvas ?
Moi, j'ai testé, mais pour le moment, c'est un peu galère pour faire quoi que ce soit (je n'y connais rien en openGL, mais ce canvas openGl a l'air vraiment intéressant ^^).
Il manque quelques fonctions simples comme DrawImage(), DrawalphaImage() sur l'opengl canvas. Du coup, ça permettrait d'afficher une image (avec transparence) sur ce gadget, comme sur un canvas classique. Et ce serait beaucoup plus simple à utiliser ensuite (on pourrait faire des opérations sur les images et les afficher ensuite).
Sinon, pour ouvrir parfaitement un png, c'était tout simple ^^ :
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
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro
@Blendman, OpenGL gère bien évidement la transparence, mais n'a aucune notion des fichiers , bmp, jpeg, png, tga, etc...
c'est une librairie bas niveau , au même titre que directx , qui te donne accès aux fonctions de ta carte graphique ( via les pilotes )
Donc la transparence ce gère dans un premier temps en software et dans la RAM , tu charges donc ton image avec n'importe quelle bibliothèque ( ici loadimage() donc )
tu stockes tout les pixels de l'image dans une matrice 2D de la taille de l'image avec les composantes qui t’intéresse , tu libères la ressource PB , et tu créer ta texture OpenGL :
https://open.gl/textures
L'identifiant de ta texture sera un GLuint ( unsigned int ) , tu pourras la récupérer de la CG vers la RAM en utilisant glGetTexImage().
@++
c'est une librairie bas niveau , au même titre que directx , qui te donne accès aux fonctions de ta carte graphique ( via les pilotes )
Donc la transparence ce gère dans un premier temps en software et dans la RAM , tu charges donc ton image avec n'importe quelle bibliothèque ( ici loadimage() donc )
tu stockes tout les pixels de l'image dans une matrice 2D de la taille de l'image avec les composantes qui t’intéresse , tu libères la ressource PB , et tu créer ta texture OpenGL :
https://open.gl/textures
L'identifiant de ta texture sera un GLuint ( unsigned int ) , tu pourras la récupérer de la CG vers la RAM en utilisant glGetTexImage().
@++
Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro
Salut
J'ai fait quelques modifications sur le code de kernadec :
- le zoom est corrigé, on peut zoomer/dézoomer sans passer de l'un à l'autre.
- on peut déplacer le canvas (comme dans photoshop/MyPaint en appuyant sur Espace)
- j'ai essayé de charger deux Images au départ, ça semble fonctionner, mais j'ai un problème : je ne vois pas l'image du dessous.
1) afficher 2 images l'une sur l'autre avec transparence
Comme je n'y connais pas encore grand chose en openGl, j'ai essayé de changer plusieurs fois les paramètres de ma procédures affiche(), sans succès.
[Edit ] : ok, j'ai trouvé, code corrigé
Sauriez-vous comment corriger ce code pour que les deux images s'affichent (ouvrez des images avec transparence si possible) ?
[/edit]
2) j'aimerai updaté l'image sur laquelle je peins (le calque actif) et l'afficher à nouveau (pour qu'on voit ce que je peins en tps réel). Dois-je reconstruire la texture à chaque et en faire un update ou y'a-t-il une autre technique ?
La technique de base de kernadec affiche bien les points, mais dès qu'on zoome, ils disparaissent, car ils ne sont pas sauvegardés, mais moi, j'aimerai aussi utilisé autre chose qu'un cercle (ou point) comme brush. J'aimerai utiliser notamment des images ^^.
[Edit2] : bon, j'ai réussi à dessiner sur l'image, puis à l'afficher. Il me reste juste un bug lorsqu'on zoome (en zoom = 0.5, ça marche, mais pas pour les autres, faut que je vois où est le soucis ^^)
Le nouveau code :
J'ai fait quelques modifications sur le code de kernadec :
- le zoom est corrigé, on peut zoomer/dézoomer sans passer de l'un à l'autre.
- on peut déplacer le canvas (comme dans photoshop/MyPaint en appuyant sur Espace)
- j'ai essayé de charger deux Images au départ, ça semble fonctionner, mais j'ai un problème : je ne vois pas l'image du dessous.
1) afficher 2 images l'une sur l'autre avec transparence
Comme je n'y connais pas encore grand chose en openGl, j'ai essayé de changer plusieurs fois les paramètres de ma procédures affiche(), sans succès.
[Edit ] : ok, j'ai trouvé, code corrigé
Sauriez-vous comment corriger ce code pour que les deux images s'affichent (ouvrez des images avec transparence si possible) ?
[/edit]
2) j'aimerai updaté l'image sur laquelle je peins (le calque actif) et l'afficher à nouveau (pour qu'on voit ce que je peins en tps réel). Dois-je reconstruire la texture à chaque et en faire un update ou y'a-t-il une autre technique ?
La technique de base de kernadec affiche bien les points, mais dès qu'on zoome, ils disparaissent, car ils ne sont pas sauvegardés, mais moi, j'aimerai aussi utilisé autre chose qu'un cercle (ou point) comme brush. J'aimerai utiliser notamment des images ^^.
[Edit2] : bon, j'ai réussi à dessiner sur l'image, puis à l'afficher. Il me reste juste un bug lorsqu'on zoome (en zoom = 0.5, ça marche, mais pas pour les autres, faut que je vois où est le soucis ^^)
Le nouveau code :
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
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro
J'y connais rien en opengl, mais j'ai pu ajouter la fonction sauvegarder.
Ça marche chez moi, et le canal alpha pas testé.
M.
Ça marche chez moi, et le canal alpha pas testé.
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
Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro
Super Mesa !
Merci beaucoup.
Merci beaucoup.
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: OpenGLGadget() Charger BMP ou PNG mode Dessin, Zoom, Ro
Je me permets un petit déterrage de topic.
Je suppose qu'en 2 ans, vous avez peut-être de nouvelles bécanes, de nouveaux OS.
Est-ce que ça marche encore bien.
Parce que j'ai passé un temps fou à essayer de comprendre la logique de la transparence. Et maintenant, que je la maîtrise impeccable, il fallait que sur d'autres ordis, ça me fasse des "pâtés".
Bon... J'aime bien les saveurs du terroir, mais, je tends au végétarien... Traduction : j'espère réussir un rendu uniforme sur tous les matériels.
Alors question qui me "rassurerait" : est-ce que OpenGL fait du yoyo buggy chez vous aussi? (les mêmes codes que ce sujet, mais sur du nouveau matériel).
Je dis ça vu que j'ai piqué le code initial de Kernadec pour en faire x versions pour explorer toute sorte de résultat chez moi.
Et que ça marche quand on ne change pas la couleur de la fenêtre avec les thèmes Windows.
Une réponse même pessimiste me ferait gagner quelques heures de tests.
Je suppose qu'en 2 ans, vous avez peut-être de nouvelles bécanes, de nouveaux OS.
Est-ce que ça marche encore bien.
Parce que j'ai passé un temps fou à essayer de comprendre la logique de la transparence. Et maintenant, que je la maîtrise impeccable, il fallait que sur d'autres ordis, ça me fasse des "pâtés".
Bon... J'aime bien les saveurs du terroir, mais, je tends au végétarien... Traduction : j'espère réussir un rendu uniforme sur tous les matériels.
Alors question qui me "rassurerait" : est-ce que OpenGL fait du yoyo buggy chez vous aussi? (les mêmes codes que ce sujet, mais sur du nouveau matériel).
Je dis ça vu que j'ai piqué le code initial de Kernadec pour en faire x versions pour explorer toute sorte de résultat chez moi.
Et que ça marche quand on ne change pas la couleur de la fenêtre avec les thèmes Windows.
Une réponse même pessimiste me ferait gagner quelques heures de tests.