Mon visualiseur d'image ....

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Mon visualiseur d'image ....

Message par jbernard13 »

bonjour
voici un petit code qui permet de charger et d'afficher une image , on utilise le clique droit de la souris pour charger l'image ....
je voudrais comment afficher plusieurs images en meme temps ( un peu comme Xnview ) jai pas de piste ...


Code : Tout sélectionner

***** Visualiseur d'images *****
;***** écris par JBERNARD

;***** Constantes *****
Enumeration
  #Fenetre_main
  #Charger_image
  #Image
EndEnumeration
;***** Création du PopupMenu  *****
 
If CreatePopupMenu(0)
  MenuItem(#Charger_image, "Charger une image ")
  
EndIf
;****************************************** 
UseJPEGImageDecoder()
UseTGAImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
;******************************************
ExamineDesktops()
;***** Procédure ******
Procedure Charger_Image()
  Fichier$ = OpenFileRequester("Charge une image ", "", " Images Formats|*.bmp;*.jpg;*.png;*.tif;*.tga", 0)
  If Fichier$
     If LoadImage(#Image, Fichier$)
      SetGadgetState(#Image, ImageID(#Image))
     EndIf
     EndIf
EndProcedure

;**** Création de la fenetre ****
If OpenWindow(#Fenetre_main,0,0,DesktopWidth(#Fenetre_main),DesktopHeight(#Fenetre_main),"Visualiseur d'images ",#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
   ImageGadget(#Image, 0, 0, WindowWidth(0), WindowHeight(0), 0)
  EndIf



;**** Boucle du programme ****


Repeat 
  Select WaitWindowEvent()
    Case #WM_RBUTTONUP
      DisplayPopupMenu(0, WindowID(0))
    Case #PB_Event_Menu
      
      Select EventMenu()
          
        Case #Charger_image : Charger_Image()
         
      EndSelect
      
      
      Case #PB_Event_CloseWindow
      Quitter =#True
  EndSelect
Until Quitter
End
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

passes par des sprites !!!

C'est quoi ta question exactement ? un affichage de toutes les images les unes à côté de sautres (vignettes) ou une notion de suivant/précédent pour visionner les images d'un répertoire ?
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Message par jbernard13 »

salut Taz

un affichage de toutes les images les unes à côté de sautres (vignettes) comme le fait Acdsee en autre .
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

utilises resizeimage

tu charges en table la liste des fichiers du répertoire sélectionné, comme tu devrais avoir le nombre d'images du répertoire, tu crées autant de gadgets image, et pour chacune d'elles, tu load puis resize et tu charges tes gadgets.

tu as saisi la méthodologie ?
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Message par jbernard13 »

tu crée un tableau?
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

Bon, dans ma grande bonté, je te donne un semblant de code générant des vignettes.
Ce code n'est pas du tout optimisé, surement qu'il donnera des boutons à Dobro :oops: , mais ça ressemble à ce que tu cherches.

Il manque une gestion d'un ascenseur pour défiler la fenêtre si tu as plus d'image (vignettes) que ton écran ne peut en afficher.

Je ne suis pas expert en PB, mais tout autant débutant que toi, mais j'ai tout trouvé via les docs de PB. tu devrais pouvoir te débrouiller pour la suite, néanmoins, si tu as besoin, fais un signe.

Code : Tout sélectionner


;***** Visualiseur d'images *****
;***** écris par JBERNARD

; Ajout par TazNormand du format "vignette"


;***** Constantes *****
Enumeration
	#Fenetre_main
	#Charger_image
	#Image
EndEnumeration
;***** Création du PopupMenu  *****
	
If CreatePopupMenu(0)
	MenuItem(#Charger_image, "Charger une image ")
	
EndIf
;****************************************** 
UseJPEGImageDecoder()
UseTGAImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
;******************************************
ExamineDesktops()
;***** Procédure ******
Procedure Charger_Image(DtW,DtH)
	Fichier$ = OpenFileRequester("Charge une ou plusieurs image(s) ", "", " Images Formats|*.bmp;*.jpg;*.png;*.tif;*.tga", 0,#PB_Requester_MultiSelection)
	If Fichier$
	    col=0
	    lig=0
	    img=1
	    While fichier$  ; Tant qu'il y a des fichiers dans notre sélection
			If LoadImage(Img, Fichier$)
			    imgW=ImageWidth(img)
			    imgH=ImageHeight(img)
			    ; Taille "maxi" d'une vignette = 1/8 de la taille écran en largeur et 1/6 en hauteur (soir 8 vignettes sur 6 lignes)
			    RatioW=DtW/8
			    RatioH=DtH/6
			    ImgResW=imgW
			    ImgResH=ImgH
			    If imgW>RatioX  ; Si la largeur de l'image est plus grande que la largeur d'une vignette
			        ImgResW=imgW/(imgW/RatioW+1)    ; Largeur redimensionnée de l'image
			        imgResH=imgH/(imgW/RatioW+1)    ; Hauteur redimensionnée de l'image MAIS avec le même ratio que la largeur
			    EndIf
			    If ImgResH>RatioH ; Si la hauteur de l'image REDIMENSIONNEE est plus grande que la hauteur d'une vignette
			        imgResH=imgH/(imgH/RatioH+1)    ; Hauteur redimensionnée de l'image
			        ImgResW=imgW/(imgH/RatioH+1)    ;  Largeur redimensionnée de l'image MAIS avec le même ratio que la Hauteur
			    EndIf
			    ResizeImage(img,ImgResW,ImgResH,#PB_Image_Smooth)   ; Redimensionner image
			    ImageGadget(Img, col*RatioW,lig*RatioH, RatioW,RatioH, img,#PB_Image_Border)
			    SetGadgetState(Img, ImageID(Img))
			    col+1
			    If col=9
			        col=0
			        lig+1
			    EndIf
			EndIf
			Fichier$ = NextSelectedFileName()
			img+1
		Wend
	EndIf
EndProcedure

;**** Création de la fenetre ****
Global DtW=DesktopWidth(#Fenetre_main)
Global DtH=DesktopHeight(#Fenetre_main)
If OpenWindow(#Fenetre_main,0,0,DtW,DtH,"Visualiseur d'images ",#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)=0
	End ; Si on peut pas ouvrir une fenêtre, autant quitter de suite, non ?
EndIf

;**** Boucle du programme ****


Repeat 
	Select WaitWindowEvent()
		Case #WM_RBUTTONUP
			DisplayPopupMenu(0, WindowID(0))
		Case #PB_Event_Menu
			
			Select EventMenu()
					
				Case #Charger_image : Charger_Image(DtW,DtH)
					
			EndSelect
			
			
			Case #PB_Event_CloseWindow
			Quitter =#True
	EndSelect
Until Quitter
End
Dernière modification par TazNormand le dim. 07/juin/2009 21:45, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

TazNormand a écrit : Ce code n'est pas du tout optimisé, surement qu'il donnera des boutons à Dobro :oops: ,
ben tu sais, je m'en fou !! :)

mes codes sont loin d'etre optimisés !! :?
pour moi l'essentiel c'est que ça marche :)

de toute façon, on s'en fou , avec les betes de courses qu'on a maintenant
c'est pas un ZX 81 ;)
Dernière modification par Backup le dim. 07/juin/2009 21:42, modifié 1 fois.
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Message par jbernard13 »

merci le code peux parait un peu compliquer a comprendre car moi et les maths on est pas amis du tout
Pourquoi tu as mis un END ICI :? j'ai dù le supprimer sinon le programme se lance pas .

Code : Tout sélectionner

If OpenWindow(#Fenetre_main,0,0,DtW,DtH,"Visualiseur d'images ",#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
  ;End ; Si on peut pas ouvrir une fenêtre, autant quitter de suite, non ?
EndIf
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

autant pour moi, j'ai zappé le "=0" à la fin de la commande "if openwindow(..."

c'est pas super compliqué, je suppose que tu parles de la notion des ratios ?

si c'est ça je t'explique :

On veut afficher 8 vignettes en lignes et ce sur 6 lignes, donc pour ça tu dis que tu divises la taille de ton "desktop" par ces valeurs (DtW et DtH correspondent aux largeurs et hauteurs du desktop)

ça va te donner la taille de tes futures vignettes.

ImgResW/imgResH ce sont les dimensions de ton/tes images redimensionnées au plus près de la taille d'une vignette

ensuite on teste si la largeur de l'image est supérieure à celle d'une vignette, si OUI, alors on redimensionne l'image, ou plutot on indique la nouvelle largeur/hauteur dans ImgResW/ImgResH.
Mais ce qu'on veut, c'est une image dans de bonnes proportions, c'est pour ça que d'abord je teste si la largeur originale de l'image ne dépasse pas celle d'une vignette, et qu'ensuite, je vérifie que la hauteur redimensionnée ne dépasse pas celle d'une vignette.

ImgResW=imgW/(imgW/RatioW+1) décomposons:
(imgW/ratioW+1) c'est le pourcentage de réduction : si tu as un écran de 800x600, et une image de 1024x768, RatioW correspond à (800/8) soit 100, qui est donc la largeur d'une vignette. RatioH correspond lui à (600/6) = 100.
On veut que notre réduction s'en approche le plus, sans la dépasser, donc on prend la largeur de notre image qu'on divise par RatioW auquel on ajoute 1 pour les "problèmes d'arrondis" : (1024/100)+1=11.24
C'est le pourcentage de réduction, on l'applique donc à notre largeur originale d'image imgW : 1024/11.24 = 91
on applique le même ratio à la hauteur : 768/11.24=68, notre image redimensionnée (vignette) fera 91x68.

Ensuite il faut tester la nouvelle hauteur pour voir si elle correspond à la hauteur d'une vignette, car imagine que tu aies une image avec un format bizarre genre 1024x2048.

En reprenant mes explications ci dessus, tu auras une nouvelle largeur de 91, mais si tu appliques le même ratio, alors tu auras une hauteur de 2048/11.24=182 et notre vignette est censée faire (600/6) soit 100.
Le test "If ImgResH>RatioH" va nous permettre d'y palier. On refait un calcul pour redimensionner d'abord la hauteur, puis le même ration à la largeur, pour garder nos proportions : imgResH=imgH/(imgH/RatioH+1)

2048/((2048/100)+1)=95

Et rebelotte, on applique le même coefficient de réduction à la largeur : ImgResW=imgW/(imgH/RatioH+1)
1024/((2048/100)+1)=47
le calcul ((2048/100)+1) donne le coef à appliquer pour les 2 dimensions de l'image.

Est-ce clair pour toi maintenant ?
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

Où en es-tu dans ton "JBernard13 View" ou "JBernard13 See" ???

Du concret ?

je vais essayer de travailler aussi sur ce sujet, dis moi où tu en es, je pourrai peut-être te filer un coup de main (ou de pied :wink: )
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Message par TazNormand »

Jbernard13, t'as abandonné ton projet ?
Image
Image
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Message par jbernard13 »

pas trop le temps en ce moment
Répondre