Afficher une image Droppée

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Afficher une image Droppée

Message par Ar-S »

Hello,

Après avoir terminé mon petit resizer d'images, j'aimerai faire une petite visionneuse fonctionnant avec le drag n drop de PB4.

Et bien je n'arrive à rien ! je suis vert.

En gros j'ai ma petite fenêtre principale qui s'ouvre.
lorsqu'on fait glisser une image dessus, je lance à Loadimage de cette image.
Mais ensuite ? que faire de cette image ?

Un OpenWindow supplémentaire ? Est-ce préférable d'utiliser un openwindowedscreen et de charger l'image en sprite ?

j'avoue ne pas du tout maitriser les sprites, pour le moment je n'ai bossé qu'en openwindow classique.

Imaginons que je fasse glisser une image en 1280x1024,
comment récupérer les dimensions de cette même image pour que la fenêtre d'affichage soit de la même taile, donc invisible (oui j'aimerai ne voir que l'image)

Voilà mon code,
la procedure Afficheimage pour le moment repère bien les images déposées.. Je suppose que ce n'est pas sorcier mais la j'ai comme un bloquage.

Code : Tout sélectionner

;VisioPics
Enumeration
  #WIN
  #Text_1
  #AFFICHE
  #WINPICS
  #AFF_PICS
  #Image
EndEnumeration
;}
UseJPEGImageDecoder () 
UsePNGImageDecoder () 
UseTGAImageDecoder () 
UseTIFFImageDecoder () 

Define.l Event, EventWindow, EventGadget, EventType, EventMenu
Procedure OpenWindow_WIN()
  If OpenWindow(#WIN, 450, 200, 246, 88, "Visiopics Drag and Drop", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    ;HideWindow(#WINPICS,1)  ; je ne sais pas quelles genre de fenetre ouvrir
    HideWindow(#WIN,0)
    If CreateGadgetList(WindowID(#WIN))
      TextGadget(#Text_1, 40, 2, 160, 17, "Mini Visioneuse d'image", #PB_Text_Center)
      EditorGadget(#AFFICHE, 5, 22, 238, 60, #PB_Editor_ReadOnly)
      SetGadgetText(#AFFICHE, "Faites simplement glisser les images"+Chr(10)+"dans la fenêtre")
      PureRESIZE_SetGadgetResize(#Text_1, 0, 0, 0, 0)
      PureCOLOR_SetGadgetColor(#Text_1, #PureCOLOR_SystemColor, $22CEF9)
      PureCOLOR_SetWindowColor(#WIN, $22CEF9)
    EndIf
    EnableWindowDrop(#WIN, #PB_Drop_Files, #PB_Drag_Copy)
  EndIf
EndProcedure

Procedure AfficheImage()
  FichierDrop$ = EventDropFiles()
  Count  = CountString(FichierDrop$, Chr(10)) + 1
  For i = 1 To Count
    MonFichier$ = StringField(FichierDrop$, i, Chr(10))
    NomFichier$=GetFilePart(MonFichier$)
    ext$=LCase(GetExtensionPart(NomFichier$))
    If ext$="jpg" Or ext$="png" Or ext$="tiff" Or ext$="tga" Or ext$="bmp"
      DirImg$=GetPathPart(MonFichier$)
      ext$=LCase(GetExtensionPart(NomFichier$))
      LoadImage(#Image, MonFichier$)
      MessageRequester("TEST","L'image déposée est : "+MonFichier$)
    Else
      MessageRequester("Erreur","Vous ne pouvez voir que des fichiers JPG, BMP,TIFF,TGA et PNG",#MB_ICONERROR)
    EndIf
  Next i
EndProcedure

OpenWindow_WIN()



;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Text_1
      ElseIf EventGadget = #AFFICHE
      EndIf
    Case #PB_Event_WindowDrop 
      
      AfficheImage()
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #WIN
        CloseWindow(#WIN)
        Break
      EndIf
  EndSelect
ForEver
Merci d'avance de votre aide,
Ajouter un petit TUTO dans la section dédiée serait pas mal
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

Une fois ton image chargée, tu peux utiliser ImageWidth() and ImageHeight() pour connnaitre les dimensions. Apres tu peux creer un ImageGadget() qui va te servir d'afficheur (tu peux meme le mettre dans ScrollAreaGadget() pour gerer les grosses images).
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

ImageWidth() et Imageheigh(), je suis vraiment une buse...
J'essaye ça, merci Fred
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Après quelques tentatives, j'arrive à afficher une fenetre aux dimensions de l'image déposée mais l'image n'apparaît pas :?

Voilà la procedure mise à jour mise à jour

Code : Tout sélectionner

Procedure AfficheImage()
  HideWindow(#WIN,1) 
  FichierDrop$ = EventDropFiles()
  Count  = CountString(FichierDrop$, Chr(10)) + 1
  For i = 1 To Count
    MonFichier$ = StringField(FichierDrop$, i, Chr(10))
    NomFichier$=GetFilePart(MonFichier$)
    ext$=LCase(GetExtensionPart(NomFichier$))
    If ext$="jpg" Or ext$="png" Or ext$="tiff" Or ext$="tga" Or ext$="bmp"
      DirImg$=GetPathPart(MonFichier$)
      ext$=LCase(GetExtensionPart(NomFichier$))
      Image:
      LoadImage(#Image, MonFichier$)
      ;MessageRequester("TEST","L'image déposée est : "+MonFichier$) ;-test
      L=ImageWidth(#Image)
      H=ImageHeight(#Image)
      OpenWindow(#WINPICS, 0, 0, L, H, "", #PB_Window_WindowCentered|#PB_Window_BorderLess)
      CreateGadgetList(WindowID(#WINPICS))
      StringGadget(#AFF_PICS, 0, H-20, 150, 20, "", #ES_CENTER|#PB_String_ReadOnly|#PB_String_BorderLess)
      ImageGadget(#VISIO, 0, 0, L, H, CatchImage(#Image, ?Image))
      PureRESIZE_SetGadgetResize(#AFF_PICS, 0, 0, 0, 0)
      PureCOLOR_SetGadgetColor(#AFF_PICS, $FF00, $0)
      PureRESIZE_SetWindowMaximumSize(#WINPICS, 5000, 5000)
      PureCOLOR_SetWindowColor(#WINPICS, $0)
      SetGadgetText(#AFF_PICS,MonFichier$)
      Else
      MessageRequester("Erreur","Vous ne pouvez voir que des fichiers JPG, BMP,TIFF,TGA et PNG",#MB_ICONERROR)
    EndIf
  Next i
  HideWindow(#WIN,0) 
EndProcedure
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

T'as essayé ImageGadget(#VISIO, 0, 0, L, H, ImageId(#Image) ) ?
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

thKs Chris

Avec ça fonctionne. :D

Comme quoi je me complique toujours la vie...

Pourquoi ImageGadget(#VISIO, 0, 0, L, H, CatchImage(#Image, ?Image)) ne fonctionne pas ?
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ar-S a écrit :thKs Chris

Avec ça fonctionne. :D

Comme quoi je me complique toujours la vie...

Pourquoi ImageGadget(#VISIO, 0, 0, L, H, CatchImage(#Image, ?Image)) ne fonctionne pas ?
Aucune idée.
Si ton image est déjà définie dans un label avec IncludeBinary, ça devrait marcher.

En tous cas, si ton image est déjà dans un label, ça ne sert à rien d'utiliser LoadImage(). Ca revient à la charger deux fois.

Code : Tout sélectionner

Image:
IncludeBinary "C:\MonDossier\MonImage\Photo001.jpg"
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Ok je pige.
Le probleme de include binary, c'est qu'il n'accepte pas une variable de type
monfichier$
C'est bien dommage.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

De toute façon, dans ton cas tu ne peux pas utiliser IncludeBinary, puisque l'image que tu affiches est celle que tu droppes dans l'appli.

IncludeBinary est valable pour une image qui n'est jamais modifiée, par exemple une icone ou le fond d'une fenêtre.
Ca permet d'inclure l'image directement dans l'application.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Oui oui c'est bien ce que j'ai réalisé.

Par contre maintenant c'est ma boucle qui chipotte.

J'arrive à afficher les image sans soucis, mais lorsque j'en Glisse plusieurs,
elle s'affichent toutes à la suite à vitesse grand V.

J'aimerai que seule la première s'affiche jusqu'à un clique gauche.
Mais entre les repeat, for next je me retrouve avec ma fenêtre qui se repete à l'infini..
Du coup voilà le code mise à jour qui fonctionne mais qui envoie ttes les images à fond ..

Si tu pouvais me guider pour structurer tout ça.
Je me dis bien qu'il faut utiliser les Event mais avec le FOR NEXT au milieu ça chie.

Code : Tout sélectionner

;VisioPics
InitMouse()
InitKeyboard()
Enumeration
  #WIN
  #Text_1
  #AFFICHE
  #WINPICS
  #AFF_PICS
  #Image
  #VISIO
EndEnumeration
;}
UseJPEGImageDecoder () 
UsePNGImageDecoder () 
UseTGAImageDecoder () 
UseTIFFImageDecoder () 

Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}


Procedure OpenWindow_WIN()
  If OpenWindow(#WIN, 450, 200, 246, 88, "Visiopics Drag and Drop", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    HideWindow(#WINPICS,1)
    HideWindow(#WIN,0)
    If CreateGadgetList(WindowID(#WIN))
      TextGadget(#Text_1, 40, 2, 160, 17, "Mini Visioneuse d'image", #PB_Text_Center)
      EditorGadget(#AFFICHE, 5, 22, 238, 60, #PB_Editor_ReadOnly)
      SetGadgetText(#AFFICHE, "Faites simplement glisser les images"+Chr(10)+"dans la fenêtre")
      PureRESIZE_SetGadgetResize(#Text_1, 0, 0, 0, 0)
      PureCOLOR_SetGadgetColor(#Text_1, #PureCOLOR_SystemColor, $22CEF9)
      PureCOLOR_SetWindowColor(#WIN, $22CEF9)
    EndIf
    EnableWindowDrop(#WIN, #PB_Drop_Files, #PB_Drag_Copy)
  EndIf
EndProcedure

Procedure AfficheImage()
  ;HideWindow(#WIN,1) 
  FichierDrop$ = EventDropFiles()
  Count  = CountString(FichierDrop$, Chr(10)) + 1
  For i = 1 To Count
    MonFichier$ = StringField(FichierDrop$, i, Chr(10))
    NomFichier$=GetFilePart(MonFichier$)
    ext$=LCase(GetExtensionPart(NomFichier$))
    
        If ext$="jpg" Or ext$="png" Or ext$="tiff" Or ext$="tga" Or ext$="bmp"
        DirImg$=GetPathPart(MonFichier$)
        ext$=LCase(GetExtensionPart(NomFichier$))
        Image:
        LoadImage(#Image, MonFichier$)
        ;MessageRequester("TEST","L'image déposée est : "+MonFichier$) ;-test
        L=ImageWidth(#Image)
        H=ImageHeight(#Image)
        If OpenWindow(#WINPICS, 0, 0, L, H+20, "", #PB_Window_WindowCentered|#PB_Window_BorderLess)
        CreateGadgetList(WindowID(#WINPICS))
        StringGadget(#AFF_PICS, 0, H, L, 20, "", #ES_CENTER|#PB_String_ReadOnly|#PB_String_BorderLess)
        ;ImageGadget(#VISIO, 0, 0, L, H, CatchImage(#Image, ?Image))
        SetGadgetText(#AFF_PICS,MonFichier$)
        ImageGadget(#VISIO, 0, 0, L, H, ImageID(#Image) )
        PureRESIZE_SetGadgetResize(#AFF_PICS, 0, 0, 0, 0)
        PureCOLOR_SetGadgetColor(#AFF_PICS, $FF00, $0)
        PureRESIZE_SetWindowMaximumSize(#WINPICS, 5000, 5000)
        PureCOLOR_SetWindowColor(#WINPICS, $0)
        
        EndIf
      Else
          MessageRequester("Erreur","Vous ne pouvez voir que des fichiers JPG, BMP,TIFF,TGA et PNG",#MB_ICONERROR)
        EndIf
        
  Next i
EndProcedure

OpenWindow_WIN()

;{- Event loop
Repeat
ExamineMouse()  
  Event = WaitWindowEvent()
  Select Event

    Case #WM_RBUTTONDOWN
      CloseWindow(#WINPICS)
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Text_1
      ElseIf EventGadget = #AFFICHE
      EndIf
    Case #PB_Event_WindowDrop  
      AfficheImage()
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #WIN
        CloseWindow(#WIN)
        Break
      EndIf
  EndSelect
ForEver
;
;}
Merci pour ton aide
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Il suffir de rajouter un delay entre chaque image.

J'ai viré des trucs pour que ça fonctionne. J'ai pas compris l'utilisation des HideWindow() et des libs PureResize() et PureColor() que je ne vois pas nécessaires dans ton exemple.

Code : Tout sélectionner

Procedure AfficheImage()
  ;HideWindow(#WIN,1)
  FichierDrop$ = EventDropFiles()
  Count  = CountString(FichierDrop$, Chr(10)) + 1
  For i = 1 To Count
    MonFichier$ = StringField(FichierDrop$, i, Chr(10))
    NomFichier$=GetFilePart(MonFichier$)
    ext$=LCase(GetExtensionPart(NomFichier$))
   
        If ext$="jpg" Or ext$="png" Or ext$="tiff" Or ext$="tga" Or ext$="bmp"
        DirImg$=GetPathPart(MonFichier$)
       ; ext$=LCase(GetExtensionPart(NomFichier$))
        Image:
        LoadImage(#Image, MonFichier$)
        ;MessageRequester("TEST","L'image déposée est : "+MonFichier$) ;-test
        L=ImageWidth(#Image)
        H=ImageHeight(#Image)
        
        If OpenWindow(#WINPICS, 0, 0, L, H+20, "", #PB_Window_WindowCentered|#PB_Window_BorderLess)
        CreateGadgetList(WindowID(#WINPICS))
        StringGadget(#AFF_PICS, 0, H, L, 20, "", #ES_CENTER|#PB_String_ReadOnly|#PB_String_BorderLess)
        ;ImageGadget(#VISIO, 0, 0, L, H, CatchImage(#Image, ?Image))
        SetGadgetText(#AFF_PICS,MonFichier$)
        ImageGadget(#VISIO, 0, 0, L, H, ImageID(#Image) )
;         PureRESIZE_SetGadgetResize(#AFF_PICS, 0, 0, 0, 0)
;         PureCOLOR_SetGadgetColor(#AFF_PICS, $FF00, $0)
;         PureRESIZE_SetWindowMaximumSize(#WINPICS, 5000, 5000)
;         PureCOLOR_SetWindowColor(#WINPICS, $0)
       
        EndIf
      Else
          MessageRequester("Erreur","Vous ne pouvez voir que des fichiers JPG, BMP,TIFF,TGA et PNG",#MB_ICONERROR)
        EndIf
     Delay(3000)  ;<<-------------- La boucle se poursuit toutes les 3 secondes
  Next i
EndProcedure
Ainsi tu peux ajouter un sélectionneur de temps d'affichage qui equivaut à un diaporama, par exemple dans une combobox... Mais si tu veux attendre un clic gauche pour afficher l'image suivante, tu dois le gérer sur la constante #image en l'occurence EventGadget = #VISIO
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Voici un exemple pour faire ce que tu veux.
Une fois que tu as sélectionné plusieurs images à afficher, tu dois cliquer sur l'image pour voir la suivante etc...

Code : Tout sélectionner

Procedure AfficheImage()
  ;HideWindow(#WIN,1)
  FichierDrop$ = EventDropFiles()
  Count  = CountString(FichierDrop$, Chr(10)) + 1
  For i = 1 To Count
    MonFichier$ = StringField(FichierDrop$, i, Chr(10))
    NomFichier$=GetFilePart(MonFichier$)
    ext$=LCase(GetExtensionPart(NomFichier$))
   
        If ext$="jpg" Or ext$="png" Or ext$="tiff" Or ext$="tga" Or ext$="bmp"
        DirImg$=GetPathPart(MonFichier$)
       ; ext$=LCase(GetExtensionPart(NomFichier$))
        Image:
        LoadImage(#Image, MonFichier$)
        ;MessageRequester("TEST","L'image déposée est : "+MonFichier$) ;-test
        L=ImageWidth(#Image)
        H=ImageHeight(#Image)
        
	        If OpenWindow(#WINPICS, 0, 0, L, H+20, "", #PB_Window_WindowCentered|#PB_Window_BorderLess)
	        CreateGadgetList(WindowID(#WINPICS))
	        StringGadget(#AFF_PICS, 0, H, L, 20, "", #ES_CENTER|#PB_String_ReadOnly|#PB_String_BorderLess)
	        ;ImageGadget(#VISIO, 0, 0, L, H, CatchImage(#Image, ?Image))
	        SetGadgetText(#AFF_PICS,MonFichier$)
	        ImageGadget(#VISIO, 0, 0, L, H, ImageID(#Image) )
	;         PureRESIZE_SetGadgetResize(#AFF_PICS, 0, 0, 0, 0)
	;         PureCOLOR_SetGadgetColor(#AFF_PICS, $FF00, $0)
	;         PureRESIZE_SetWindowMaximumSize(#WINPICS, 5000, 5000)
	;         PureCOLOR_SetWindowColor(#WINPICS, $0)
	          Repeat 
						 Event = WaitWindowEvent() 				     
						  Select Event
						   Case #PB_Event_Gadget 
						     Select EventGadget()						     
						      Case #VISIO : Break 				     
						     EndSelect
						 EndSelect
					  ForEver  
						
	        EndIf
				
      Else
          MessageRequester("Erreur","Vous ne pouvez voir que des fichiers JPG, BMP,TIFF,TGA et PNG",#MB_ICONERROR)
        EndIf
    ; Delay(5000) 
  Next i
EndProcedure
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Merci pour ces explication Jacobus.

Pour PURERESIZE et le HIDEWINDOW ils ne servent effectivement à rien.
le Resize faisait planté ma version 4.02 donc c'était pour le tester simplement. Quand au Hidewindow, c'était au début de ma procédure lorsque je n'arrivait pas à faire changer d'image au clique. je voulais juste que
Si Derniere image alors cache fenêtre #winpics.
Ppar contre le purecolor je le garde, je préfères que l'arrière plan reste noir et que le nom du fichier soit en vert.
(peut-être a tu testé avec des grandes images mais si tu essayes des petites tu vois le nom du fichiers au dessous de l'image.)

Donc si j'ai bien compris,

le Case #VISIO : Break signifie simplement que
si une action est tenté sur le gadget #VISIO, alors un break se produit et la boucle repart au FOR ?

J'avoue que c'est plus simple encore que je ne le pensais (comme d'hab) mais ça me permet de mieux comprendre l'inclusion d'une boucle dans une autre.

Merci encore. :P
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

le Case #VISIO : Break signifie simplement que
si une action est tenté sur le gadget #VISIO, alors un break se produit et la boucle repart au FOR ?
Oui c'est exactement ça. Tu as 2 boucles imbriquées (gestion de la fenêtre d'affichage de l'image) et en cliquant sur ton image tu sors de la seconde pour retourner à la première. Mais tu peux aussi lui faire faire d'autres actions (agrandir, minimiser, etc...)

Bien que j'utilise aussi des libs de Gnozal, là tu n'en a pas besoin car tu as ce qu'il faut pour colorier des gadgets avec SetgadgetColor() est fait pour.La lib PureColor te permet par contre de colorer des boutons, ce que ne fait pas encore PB.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre