IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Modifier les dimensions d'une image JPG


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut Modifier les dimensions d'une image JPG
    Bonjour à tous
    Nul en VB.net, j'apprends en faisant des petits programmes.
    J'ai une Form contenant un FlowLayoutPanel dans lequel j'introduis dynamiquement des PictureBox contenant les photos prélevées dans un répertoire.
    La propriété ModeSize des PictureBox est StretchImage et ça fonctionne bien, sauf que au bout d'un certain nombre de photos affichées, l'exeption "Mémoire insuffisante" est trouvée.
    Je suppose que les photos, bien que réduites à l'écran conservent toute leur place dans la mémoire utilisée.
    Question : Il y a-t-il un moyen de modifier les dimensions d'une image avant de la placer dans un PictureBox.
    Les propriétés ".Height" et ".Width" de l'image étant en lecture seule, je n'ai pas pu les modifier.
    Merci de votre réponse

    Claude Azoulai

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    Je suppose que les photos, bien que réduites à l'écran conservent toute leur place dans la mémoire utilisée.
    Oui.

    Il y a plusieurs solutions, la première est de libérer des ressources, en déchargeant les bitmaps qui ne sont pas affichés. En fait de charger les bitmap en fonction de l'affichage.

    L'autre solution est effectivement de diminuer soit le nombre de dpi de l'image soit la taille en pixels. Ceci n'est pas facilement réalisable avec GDI+ (ou GDI).

    Si vous le souhaitez vous pouvez aller faire un tour du coté de www.xnview.com et utiliser la GFLSDK avec le wrapper pour vb.net que j'ai écrit (vous le trouverez sur le forum GFLSDK du site indiqué). L'exemple fournit permet de "retailler" une image.

    A+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    A Geo2A

    Merci de ton aide
    J'ai téléchargé GflSDK-win.zip sur le site de XnView.
    Je n'ai pas trouvé d'exemple en VB.Net, mais j'en ai trouvé un en Visual Basic qui refuse de fonctionner car il ne trouve pas libgfl305dll.
    Dans le forum XnView, j'ai trouvé une réponse proposant de remplacer libgfl30 par libgfl311, mais ça ne marche pas mieux.
    Peux-tu m'aider dans cette recherche du bon fichier à télécharger ?
    Merci d'avance et excuse moi de mon incapacité

    Claude Azoulai

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour


    Tu peux télécharger le wrapper ici:

    http://download.xnview.com/GFL-VB.NET.zip

    Il marche avec la 3.11

    En fait c'est un projet vb.net complet

    Bon courage, reste sur ce fil pour le suivi

    A+

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    Merci de ton aide

    J'ai regardé ton programme qui fonctionne sans problème.
    Moi qui suis débutant en VB.Net je suis estomaqué de voir qu'il faut tant de code.
    Mon problème est peut-être plus simple et je me suis souvenu qu'il y a 20 ans j'ai utilisé, dans une application professionelle, une API pour imprimer des images "StretchBlt" et j'ai essayé de l'utiliser, mais sans succès.
    Voici le code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
        Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
            Dim I, L, H, NbrFic As Integer
            Dim ApiError As Integer
            Dim Ratio As Single
            Dim MonImage As System.Drawing.Bitmap
            Dim Panel1 As New Panel
            Dim Picture1 As New PictureBox
            Dim Counter As System.Collections.ObjectModel.ReadOnlyCollection(Of String)
     
            Counter = My.Computer.FileSystem.GetFiles(Chemin)
            NbrFic = Counter.Count
            Application.DoEvents()
     
            For Each ImageTrouvée In _
            My.Computer.FileSystem.GetFiles(Chemin, _
                                            FileIO.SearchOption.SearchTopLevelOnly, "*.jpg*")
     
                MonImage = New System.Drawing.Bitmap(ImageTrouvée)
                L = MonImage.Width
                H = MonImage.Height
                Ratio = H / L
                If Ratio > 1 Then
                    Picture1.Width = 90 / Ratio
                    Picture1.Height = 90
                Else
                    Picture1.Width = 90
                    Picture1.Height = 90 * Ratio
                End If
                Picture1.Top = (100 - Picture1.Height) / 2
                Picture1.Left = (100 - Picture1.Width) / 2
                Picture1.SizeMode = PictureBoxSizeMode.StretchImage
                Picture1.Image = MonImage	'Là ça fonctionne bien mais l'image est trop volumineuse
    	'-------------------------------------------------------------------
    	'Je voudrais la remplacer par l'Api suivante ou une autre plus adéquate pour réduire le poids de l'image
                ApiError = StretchBlt(Picture1.hDC, 0, 0, Picture1.Width, Picture1.Height, MonImage.hDC, 0, 0, MonImage.Width, MonImage.Height, SRCCOPY)
    	'-------------------------------------------------------------------
                Panel1.Width = 100
                Panel1.Height = 100
                Panel1.BackColor = Color.White
                Fond.Controls.Add(Panel1)  'Fond est un FlowLayoutPanel
                Panel1.Controls.Add(Picture1)
                AddHandler Picture1.Click, AddressOf PictureClique
                AddHandler Picture1.LostFocus, AddressOf PictureLostFocus
                AddHandler Picture1.GotFocus, AddressOf PictureGotFocus
                Panel1 = New Panel
                Picture1 = New PictureBox
                I += 1
                Application.DoEvents()
            Next
     
        End Sub
    Peut-être pourrait-tu m'aider dans l'utilisation de l'API adéquate.

    Merci de ta réponse

    Claude Azoulai

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    Moi qui suis débutant en VB.Net je suis estomaqué de voir qu'il faut tant de code.
    Attention le wrapper permet d'utiliser TOUTES les fonctiosn de la GFLSDK donc c'est normal qu'il y ai autant de code, il faut "traduire" toutes les structures ... Plus implémenter la GDI32 car comme tu l'as remarqué c'est cette dll qui est utilisée par lewrapper car la GFLSDK fournit non pas un bitmap mais une structure proche d'un DIB sous windows. De plus la classe bitmap de system.drawing est très mal à l'aise avec les Bitmap de grande taille et les bitmap en bicolore ou 256 couleurs.

    Deuxièmement l'utilisation de strechtBlt ne permet pas de diminuer la taille de l'image, car en fait elle ne fait qu'adapter le rendu sur le picturebox par rapport à la taille réelle en mémoire. Utiliser cette API ou une autre ne te permet pas de diminuer la taille de l'image en mémoire ( et c'est identique d'utiliser les fonctions natives de GDI+). Seule la fonction "retaille" implémentée dans le wrapper permet effectivement de diminuer la taille mémoire de l'image.
    Pour ma part je l'utilise en compagnie d'une autre classe (en faite bien d'autres) qui gère le DC du PictureBox, cette classe me permet de savoir en permanence quelle est la taille réelle (en mètre) du pixel écran, comme je connais aussi la taille en mètre du pixel image (c'est pour cela que la classe ce nomme GEO_DIB, GEO pour géographique), je gère l'affichage en fonction de cela.

    Je crois que même si le code te paraît lourd et complexe, le fait d'utiliser la wrapper va te permettre beaucoup de choses, par exemple modifier le contraste, la luminosité etc .. et tout cela en quelques lignes de code.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    Merci Geo2A

    Ton dernier message a éclairé ma connaissance et m'a beaucoup interressé.
    J'ai donc cherché et cherché encore une documentation quelconque sur la librairie GFLSDK ; en vain.
    J'ai un livre sur les API Win32 de Dan Appleman, mais comme je m'y attendais, elle n'y est pas documentée.
    Je me demande comment font les programmeurs pour utiliser une librairie dont les auteurs ne fournissent pas une documentation sur leur produit.
    Si tu connais un endroit où je pourrais trouver ce que je cherche, je serais ravis de le connaître aussi.

    Claude Azoulai

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour

    J'ai un livre sur les API Win32 de Dan Appleman
    Garde le précieusement il fait partie des collectors !! Comme il n'est plus édité il y en a qui le cherche à prix d'or!!
    J'ai tout appris de la GDI32 avec ce bouquin (et quelques tubes d'aspirines).

    Pour la doc de la GFL en fait quand tu la télécharge tu as un fichier d'aide qui est accessible depuis le menu programme de windows. L'aide décrit les fonctions GFL en C. De plus la dernière version n'est pas à jour au niveau des structure GFL_BITMAP. Donc il faut regarder les exemples VB6 et traduire en .Net. Mais si tu regarde le projet que j'ai écrit tu verra que l'ensemble des fonctions sont traduites pour du .Net. Ça n'a pas été facile je te rassure !!

    En fait si tu as les notions de GDI32 avec le bouquin d'Appleman (ch 7,8,9) plus une lecture de la MSDN sur l'appel d'API32 en .Net (recherche avec "API32" dans l'aide de VS2008) tu devrais tout comprendre (ceci dit pas sans quelques efforts et quelques heures).

    A+

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    Bonjour Geo2A

    J'ai trouvé ce que je cherchais, à savoir une documentation sur le GFL SDK.
    L'adresse est : http://wiki.xnview.com/index.php?title=GFL_SDK
    Ensuite cliquer sur "Download Reference Manual as PDF".
    Je suppose que tu le savais, mais ça peut servir à d'autres personnes et c'est pourquoi je le signale.
    En tous les cas, j'ai apprécié ton aide et je t'en remercie.

    Claude Azoulai

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    Je suppose que tu le savais
    Ben non, merci pour l'info.

    SI tu as d'autres questions en cours de route ben n'hésite pas.

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier les dimensions d'une image insérée (jpg)
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 47
    Dernier message: 21/08/2008, 09h47
  2. Modifier les dimensions d'une image
    Par LoicH dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/10/2007, 23h53
  3. [ImageMagick] Obtenir les dimensions d'une image externe?
    Par Death83 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 31/01/2006, 10h57
  4. [Image] Connaitre les dimensions d'une image sans la charger
    Par FredN dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 16/01/2006, 13h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo