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

Lazarus Pascal Discussion :

Problème avec Jpeg.CompressionQuality


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Problème avec Jpeg.CompressionQuality
    Bonjour à toutes et à tous,

    Dans un programme, je charge un millier d'images Jpg. Sur ce millier, j'en réenregistre 900 telles quelles. Les cent autres sont modifiées en taille avant d'être réenregistrées.

    Pour ces 900, j'écris ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for i:= 0 to 899 do
    begin
      Pict:= Tpicture.Create;
      Pict.LoadFromFile(FchE[i]);
      ... // D'autres tâches liées à ces fichiers
      Pict.Jpeg.Compression.Quality:= 50;
      Pict.SaveToFile(FchS[i]);
      Pict.Free;
    end;
    Ça fonctionne bien sauf que le taux de compression que j'impose n'est pas pris en compte.

    Je modifie mon code en introduisant un autre objet Tpicture tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for i:= 0 to 899 do
    begin
      Pict:= TPicture.Create;
      Pict.LoadFromFile(FchE[i]);
      ... // D'autres tâches liées à ces fichiers
      PictDst:= TPicture.Create;
      PictDst.Bitmap.Assign(Pict.Bitmap); // Recopie de Pict dans PictDst
      PictDst.Jpeg.Compression.Quality:= 50;
      PictDst.SaveToFile(FchS[i]);
      Pict.Free;
      PictDst.Free;
    end;
    Cette fois-ci, mon taux de compression est bien pris en compte, mais, à cause de la recopie, cela prend beaucoup plus de temps que la première solution.

    Existe-t-il une astuce pour faire en sorte qu'avec un seul TPicture, le taux de compression soit pris en compte ?

    Merci pour vos renseignements.

    Cordialement.

    Pierre

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Salut,

    peut-être en n'utilisant pas TPicture mais plutôt directement TJPEGImage ?

    Exemple (non testé !)
    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
    procedure TForm1.CompressGettingImage;
    var
      ImageJPG:TJPEGImage; path:string;
    begin
      if OpenImage.Execute then begin
        ImageJPG := TJPEGImage.Create;
        path := OpenImage.FileName;
        try
          ImageJPG.LoadFromFile(path);
          ImageJPG.CompressionQuality := 50;
          ImageJPG.SaveToFile('fileCompress.jpg');
        finally
          ImageJPG.Free;
        end;
      end;
    end;
    ça vient de là, complètement à côté de la plaque (mais tout sert à tout dans la vie)

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci Jipété pour cette proposition. Malheureusement, elle fait exactement ce que faisait ma solution avec un seul TPicure : le coefficient de compression n'est pas pris en compte.

    Par ailleurs, j'avais fait un suivi pas à pas avec le debugger et avec ma première solution et il me semble (il faudra que je revérifie) que dans le cheminement, un TJPEGImage était mis en œuvre.

    Cordialement.

    Pierre

  4. #4
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut essaye comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for i:= 0 to 899 do
    var 
      PictDst : TJPEGImage;
    begin
      Pict:= TPicture.Create;
      Pict.LoadFromFile(FchE[i]);
      ... // D'autres tâches liées à ces fichiers
      PictDst := TJpegImage.Create;
      PictDst.CompressionQuality := 90;
      PictDst.Assign(Pict.Bitmap);
      PictDst.SaveToFile(FchS[i]);  
      Pict.Free;
      PictDst.Free;
    end;
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut essayes comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      PictDst.Assign(Pict.Bitmap);
    J'ai peur qu'on retombe sur la copie du TBitmap vers le TPicture, qui rallonge le processus...

    Un truc probablement complètement idiot mais qui ne tente rien n'a rien, pourrait être de tester la 1re option (celle qui n'a pas d'action) en inversant deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for i:= 0 to 899 do
    begin
      Pict:= Tpicture.Create;
      Pict.Jpeg.Compression.Quality:= 50; // "remonté" ici
      Pict.LoadFromFile(FchE[i]);
      ... // D'autres tâches liées à ces fichiers
    //  Pict.Jpeg.Compression.Quality:= 50;
      Pict.SaveToFile(FchS[i]);
      Pict.Free;
    end;

  6. #6
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Je viens de faire un petit test

    Le petit bout de code que je t'ai donné fonctionne le taux de compression est bien pris en charge par contre il y a un bug à l'ouverture d'un JPEG il semblerai que l'information sur la compression ne soit pas mise à jour. Elle affiche toujours 75

    EDIT :

    Je viens de tester ce petit de code quand même par curiosité :

    Pic.jpeg.CompressionQuality := 15;
    Pic.jpeg.SaveToFile(SPD.FileName);
    Celui-ci ne fonctionne pas. L'image est bien sauvegardée, mais le taux de compression est identique. C'est vraiment la misère la gestion des bitmaps avec Lazarus
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Un truc à lire et à méditer (écrit par une pointure en Delphi) :
    "Changing properties like CompressionQuality does not force compression.
    To force compression, call Compress.
    "
    http://codeverge.com/embarcadero.del...ity-is/1076400

    Un autre truc à voir et à traduire : https://gathering.tweakers.net/forum...essages/468180

    Et sinon, tous les exemples que j'ai pu voir utilisent un TBitmap intermédiaire (un embryon d'explication dans un des bouts de code du lien précédent).

  8. #8
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Un truc à lire et à méditer (écrit par une pointure en Delphi) :
    "Changing properties like CompressionQuality does not force compression.
    To force compression, call Compress.
    "
    http://codeverge.com/embarcadero.del...ity-is/1076400

    Un autre truc à voir et à traduire : https://gathering.tweakers.net/forum...essages/468180

    Et sinon, tous les exemples que j'ai pu voir utilisent un TBitmap intermédiaire (un embryon d'explication dans un des bouts de code du lien précédent).
    Intéressant le deuxième lien. Seul soucis la fonction Compress n'est pas disponible avec Lazarus

    Ci-joint mon petit projet de test : SaveJPEG.zip
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Intéressant le deuxième lien. Seul souci, la fonction Compress n'est pas disponible avec Lazarus
    La messe est dite, plus qu'à aller à la pêche...

    D'autant plus que dans ce lien, le deuxième post suggère de déclarer un bug, le troisième dit qu'il l'a fait mais sans donner son numéro pour qu'on puisse suivre l'affaire,

    On peut en conclure que 7 ans plus tard on n'a pas avancé d'un poil...

  10. #10
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Je vous remercie tous pour les propositions que vous m'avez faites.

    J'ai passé la matinée à les essayer ... Malheureusement, aucune d'entre-elles ne donne satisfaction.

    Qu'il s'agisse de déplacer l'instruction de compression, d'utiliser TJPEGImage au lieu de TPicture.

    La seule chose qui fasse que le taux de compression soit pris en compte est d'utiliser un transfert : PictDst.Assign(Pict.Bitmap);. Mais c'est au prix d'un augmentation significative du temps de traitement.

    Comme Jipété le dit, il semble que la messe est dite

    Cordialement.

    Pierre

  11. #11
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Je vous remercie tous pour les propositions que vous m'avez faites.

    J'ai passé la matinée à les essayer ... Malheureusement, aucune d'entre-elles ne donne satisfaction.

    Qu'il s'agisse de déplacer l'instruction de compression, d'utiliser TJPEGImage au lieu de TPicture.

    La seule chose qui fasse que le taux de compression soit pris en compte est d'utiliser un transfert : PictDst.Assign(Pict.Bitmap);. Mais c'est au prix d'un augmentation significative du temps de traitement.

    Comme Jipété le dit, il semble que la messe est dite

    Cordialement.

    Pierre
    Au lieu de charger tes jpeg dans un TPicture tu peux les charger directement dans un TJpegImage (à moins que ce ne soit pas que des Jpeg). Et là plus besoin de transfert avec PictDst.Assign(Pict.Bitmap);As tu essayé le projet de test que j'ai joint ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

Discussions similaires

  1. [TImage]Problème affichage jpeg avec qualité >90
    Par Bourak dans le forum Composants VCL
    Réponses: 0
    Dernier message: 18/10/2010, 11h33
  2. Problème avec l'unité JPEG
    Par f54m dans le forum EDI
    Réponses: 5
    Dernier message: 26/09/2005, 03h45
  3. Problème avec TMemoryStream + jpeg
    Par zymoplex dans le forum Langage
    Réponses: 2
    Dernier message: 01/02/2004, 19h46
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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