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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    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 chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    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 éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    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 chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    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 éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    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 chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    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.

+ 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, 08h47
  2. Modifier les dimensions d'une image
    Par LoicH dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/10/2007, 22h53
  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, 09h57
  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, 12h06

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