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

Langage Delphi Discussion :

Vitesse de chargement d'une image jpg ?


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 63
    Points : 47
    Points
    47
    Par défaut Vitesse de chargement d'une image jpg ?
    Bonjour,

    Disposant d'une série d'images jpg (disons de tailles 1500 x 1000), je souhaite les afficher sous forme de vignettes le plus rapidement possible. Une touche à répétition (flèche) faisant passer d'une image à l'autre.

    L'affichage se fait actuellement dans un TImage de 128 x 128 avec les propriétés Stretch, Proportional et Center à True.
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image.Picture.LoadFromFile('image.jpg')
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    jpg := TJpegImage.Create;
    try
      jpg.Performance := jpBestSpeed;
      jpg.Scale := jsEighth;
      jpg.LoadFromFile('image.jpg');
      Image.Picture.assign(jpg);
    finally
      jpg.Free;
    end;
    Je n'ai pas noté d'amélioration de la vitesse d'affichage dans le second cas. Où est mon erreur ?

    Merci d'avoir pris le temps de me lire...

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Pour NonoVisu j'ai aussi utilisé cette méthode
    ( http://nono40.developpez.com/nonovisu.html )
    Voici la partie du code en question :
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    procedure TVignette.LectureVignette;
    Var BitMap2 :TPicture;
        Rect    :TRect;
        Ecart   :Integer;
    begin
      FBitMap.Width :=TailleBMP;
      FBitMap.Height:=TailleBMP;
      BitMap2:=TPicture.Create;
      Try
        FBitMap.Canvas.Pen  .Color:=clBtnFace;
        FBitMap.Canvas.Brush.Color:=clBtnFace;
        FBitMap.Canvas.Rectangle(0,0,TailleBMP,TailleBMP);
        Try
          BitMap2.LoadFromFile(FFichier);
          BitMapWidth  :=BitMap2.Width;
          BitMapHeight :=BitMap2.Height;
          // Optimisation de la lecture de la vignette en cas de JPEG
          If (BitMap2.Graphic Is TJpegImage) Then
          Begin
            If (Bitmap2.Width >= (TailleBMP*4)) Or (Bitmap2.Height >= (TailleBMP*4))
              Then TJpegImage(BitMap2.Graphic).Scale:=jsEighth
              Else If (Bitmap2.Width >= (TailleBMP*2)) Or (Bitmap2.Height >= (TailleBMP*2))
                Then TJpegImage(BitMap2.Graphic).Scale:=jsQuarter
                Else If (Bitmap2.Width >= (TailleBMP)) Or (Bitmap2.Height >= (TailleBMP))
                  Then TJpegImage(BitMap2.Graphic).Scale:=jsHalf
                  Else TJpegImage(BitMap2.Graphic).Scale:=jsFullSize;
          End;
     
          With Rect Do
          Begin
            If BitMap2.Width>BitMap2.Height
            Then Begin
              Top   :=0;
              Left  :=0;
              Bottom:=(TailleBMP*BitMap2.Height)Div BitMap2.Width;
              Right := TailleBMP;
              Ecart :=(TailleBMP-Bottom)Div 2;
              Inc(Top   ,Ecart);
              Inc(Bottom,Ecart);
            End
            Else Begin
              Top   :=0;
              Left  :=0;
              Bottom:= TailleBMP;
              Right :=(TailleBMP*BitMap2.Width)Div BitMap2.Height;
              Ecart :=(TailleBMP-Right)Div 2;
              Inc(Left ,Ecart);
              Inc(Right,Ecart);
            End;
          End;
          FBitMap.Canvas.StretchDraw(Rect,BitMap2.Graphic);
          FBitMapOK:=True;
        Except
          With Rect Do
          Begin
            Top   := 0;
            Left  := 0;
            Bottom:= TailleBMP;
            Right := TailleBMP;
            FBitMap.Canvas.StretchDraw(Rect,BMPErreur);
          End;
          FBitMapOK:=False;
        End;
      Finally
        BitMap2.Free;
      End;
      Invalidate;
    end;
    Deux remarques:
    jpg.Performance n'est utilisé que pour la compression. A la lecture c'est inutile.
    Le décodage n'est pas effectué sur le LoadFromFile mais sur la méthode privée "GetBitmap" implicitement appelée lors du Assign.
    Il faut donc mettre Scale à jsEighth après le LoadFromFile.

    Tu veras que cette la méthode que tu as prise sera effectivement beaucoup plus rapide qu'une lecture pleine échelle.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 63
    Points : 47
    Points
    47
    Par défaut
    Merci beaucoup pour cette réponse

    J'ai donc modifié mon code comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    jpg := TJpegImage.Create; 
    try 
      jpg.LoadFromFile('image.jpg'); 
      jpg.Scale := jsEighth; 
      Image.Picture.assign(jpg); 
    finally 
      jpg.Free; 
    end;
    mais il ne me semble pas que l'affichage soit plus rapide, qu'il y ait ou non la ligne jpg.Scale := jsEighth :

    Enfin, je la laisse tout de même dans mon code final.

    Amitiés.

    Yves.

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut


    Bizarre... Tu peux mettre l'image en ligne quelque part si ce n'est pas indiscret ?

  5. #5
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Je me permet de faire une ptite remarque à ce sujet, j'utilise moi aussi cette méthode de chargement mais je me suis aperçu que le chargement étais effectivement beaucoup plus rapide mais la qualité de la miniature est très décevante dans certains cas, je l'ai donc abandonnée. Et je suis resté sur le bon vieux loadFromFile() en stretch, ... Faudra choisir entre qualité et vitesse de chargement .

  6. #6
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    lil_jam63
    Regarde mon code de plus pret... Suivant la taille de l'image j'adapte l'échelle afin de ne pas perdre en qualité sur les petites images.

  7. #7
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    J'ai remarqué cette adaptation mais malgré cela je me retrouve quand même avec une miniature pixélisée sur certaines images (pas toutes).

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

Discussions similaires

  1. Inserer une image.jpg dans table
    Par loumanga dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 30/01/2006, 14h14
  2. Réponses: 2
    Dernier message: 27/12/2004, 09h23
  3. [debutant]Chargement d'une image de mes documents
    Par reineville dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/03/2004, 09h52
  4. Afficher une image JPG qui se trouve dans une bdd
    Par Harry dans le forum Bases de données
    Réponses: 6
    Dernier message: 27/02/2004, 10h51
  5. Charger et afficher une image jpg avec les mfc
    Par glop - pas glop dans le forum MFC
    Réponses: 3
    Dernier message: 11/02/2004, 18h59

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