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

 Delphi Discussion :

[D6][Windows 11 64 bits] Après sauvegarde, mon fichier .bmp a la même taille que mon fichier .jpg


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 436
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 436
    Points : 1 328
    Points
    1 328
    Par défaut [D6][Windows 11 64 bits] Après sauvegarde, mon fichier .bmp a la même taille que mon fichier .jpg
    Bonjour à toutes et à tous,

    Avec mon code, je ne comprends pas le résultat de ma sauvegarde, le fichier Bmp a bien l'extension 'Test.bmp' et le fichier Jpg a bien l'extension 'Test.jpg' et pourtant ils ont la même taille ?

    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
     
    Var 
     
        jpg:TJPEGImage;
        bmp:TBitMap;
    begin
     
    Sd2.Filter := 'Fichier photo (*.bmp)|*.bmp|Fichier photo (*.jpg;*.jpeg)|*.jpg;*.jpeg|'; 
     
    if not Sd2.Execute then exit else begin
     
    With Sd2 Do
      Begin
        // Création des images temporaires
        jpg:=TJPEGImage.Create;
        bmp:=TBitMap.Create;
        Try
          // Le bitmap est lu
          bmp.assign(imagesource1.picture.bitmap);
          bmp.PixelFormat := pf24bit;
          bmp.SaveToFile(sd2.filename);
     
          jpg.CompressionQuality:= 80;
          // Image en couleur
          jpg.GrayScale:=False;
          // Copie du BMP dans le JPG
          jpg.Assign(bmp);
          // Et sauvegarde du JPG
          jpg.SaveToFile(sd2.filename);
     
        Finally
          jpg.Free;
          bmp.Free;
        End;
      End;
    end;
    Si je sépare les deux sauvegardes j'ai bien un fichier Bmp et un Fichier Jpg de différentes tailles.

    Si quelqu'un à une idée du pourquoi merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 488
    Points : 24 964
    Points
    24 964
    Par défaut
    sd2.filename je ferais tout de même un ChangeFileExt(sd2.filename, '.bmp') et ChangeFileExt(sd2.filename, '.jpg')
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 436
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 436
    Points : 1 328
    Points
    1 328
    Par défaut
    Bonjour à toutes et à tous,

    @ ShaiLeTroll, grand merci pour la solution toute simple que je n'avais jamais exploitée avec les composants TSaveDialog et TOpenDialog.

    Ce qui donne :

    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
     
    Var jpg:TJPEGImage;
        bmp:TBitMap;
     
        Extension : string;
    begin
     
    Sd2.Filter := 'Fichier photo (*.bmp)|*.bmp|Fichier photo (*.jpg;*.jpeg)|*.jpg;*.jpeg|';  //Fichier photo (*.jpg;*.jpeg)|*.jpg;*.jpeg|' ;
     
    if not Sd2.Execute then exit else begin
     
        // Création des images temporaires
        bmp:=TBitMap.Create;
        jpg:=TJPEGImage.Create;
        Try
          // Le bitmap est lu
          bmp.assign(imagesource1.picture.bitmap);
          bmp.PixelFormat := pf24bit;
          //Sauvegarde en bmp
          bmp.SaveToFile(ChangeFileExt(sd2.filename, '.bmp'));
     
          jpg.CompressionQuality:= 80;
          // Image en couleur
          jpg.GrayScale:=False;
          // Copie du BMP dans le JPG
          jpg.Assign(bmp);
          // Et sauvegarde du JPG
          jpg.SaveToFile(ChangeFileExt(sd2.filename, '.jpg')); 
     
          Finally
          jpg.Free;
          bmp.Free;
        End;
      End;
    Dans mes essais j'étais parti sur la propriété du TSaveDialog soit "Filterindex = 1 pour .Bmp et 2 pour .Jpg" et naturellement un bug.

    Bon weekend et encore merci pour toutes tes réponses fructueuses.

    @+,

    cincap

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 436
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 436
    Points : 1 328
    Points
    1 328
    Par défaut
    Bonjour à toutes et à tous,

    @ ShaiLeTroll, juste une petite remarque avec la solution et "Sd2.execute", en sauvegardant le fichier si je choisis en .bmp, le fichier en .jpg est aussi sauvegardé en même temps avec le même nom, je ne sais pas choisir .bmp ou .jpg malgré les deux extensions séparées.

    C'est un demi mal.

    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
     
     
    Var jpg:TJPEGImage;
        bmp:TBitMap;
     
        Extension : string;
    begin
     
    Sd2.Filter := 'Fichier photo (*.bmp)|*.bmp|Fichier photo (*.jpg;*.jpeg)|*.jpg;*.jpeg|';  //Fichier photo (*.jpg;*.jpeg)|*.jpg;*.jpeg|' ;
     
    if not Sd2.Execute then exit else begin
     
        // Création des images temporaires
        bmp:=TBitMap.Create;
        jpg:=TJPEGImage.Create;
        Try
          // Le bitmap est lu
          bmp.assign(imagesource1.picture.bitmap);
          bmp.PixelFormat := pf24bit;
          //Sauvegarde en bmp
          bmp.SaveToFile(ChangeFileExt(sd2.filename, '.bmp'));
     
          jpg.CompressionQuality:= 80;
          // Image en couleur
          jpg.GrayScale:=False;
          // Copie du BMP dans le JPG
          jpg.Assign(bmp);
          // Et sauvegarde du JPG
          jpg.SaveToFile(ChangeFileExt(sd2.filename, '.jpg')); 
     
          Finally
          jpg.Free;
          bmp.Free;
        End;
      End;
    Voila voilou.

    @+,

    cincap

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 436
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 436
    Points : 1 328
    Points
    1 328
    Par défaut
    Bon j'ai corrigé la procédure de sauvegarde pour soit un fichier .bmp soit un fichier .jpg.

    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
     
     with Sd2 {or SaveDialog1}do begin
         Filter     := 'Bitmap (*.bmp)|*.bmp|Jpeg (*.jpeg;*.jpg)|*.jpg' ;
         DefaultExt := '.bmp';
         if not execute then exit else
            case FilterIndex of
                 1 : with TBitmap.Create do
                     try
                       Assign(imagesource1.picture.bitmap);
                       PixelFormat := pf24bit;
                       SaveToFile(ChangeFileExt(FileName,'.bmp'));
                     finally
                       Free;
                     end;
     
                 2 : with TJPEGImage.Create do
                     try
                       CompressionQuality  := 80; {75..85 : best ratio Size/Quality}
                       ProgressiveEncoding := True; {True : good for web or slow computer}
                       Assign(imagesource1.picture.bitmap);
                       SaveToFile(ChangeFileExt(FileName,'.jpg'));
                     finally
                       Free;
                     end;
    end;
    end;
    @+,

    cincap

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    j'aurais plutôt tendance à me fier à l'extension qu'au filterIndex...ça peut fonctionner mais si demain tu ajoutes ou modifie l'ordre des filtres tu auras une surprise...notamment si tu ajoutes *.*

    quelque chose de cet ordre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      var ext := ExtractFileExt(FileName).ToUpper;
      if (ext = '.JPG') or (ext = '.JPEG') then
       ...
      else
      if (ext = '.BMP') then 
       ...
      else
      ShowMessage('Format d''image non supporté');
    EDIT: ça permet par ailleurs de faire une fonction SaveToFile indépendante du mode d'acquisition du nom du fichier.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 436
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 436
    Points : 1 328
    Points
    1 328
    Par défaut
    Bonjour à toutes et à tous,

    @ Paul TOTH, merci pour la suggestion logique et que j'ai appliquée dans ma procédure de sauvegarde.

    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
     
    with Sd2 {or SaveDialog2}do begin
         Filter     := 'Bitmap (*.bmp)|*.bmp|Jpeg (*.jpeg;*.jpg)|*.jpg|' ;
         DefaultExt := '.bmp';
     
      Bmp := TBitmap.Create;
      Bmp.PixelFormat := pf32bit;
      Jpg := TJPEGImage.Create;
     
      try
      if not execute then exit else 
     
      if LowerCase(ExtractFileExt(Sd2.FileName)) = '.bmp' then
        begin
     
        Bmp.Assign(imagesource1.picture.bitmap);
        Bmp.PixelFormat := pf24bit;
       Bmp.SaveToFile(Sd2.filename);
      end;
     
      if LowerCase(ExtractFileExt(Sd2.FileName)) = '.jpg' then
        begin
       Bmp.Assign(imagesource1.picture.bitmap);
       Jpg.CompressionQuality  := 80; {75..85 : best ratio Size/Quality}
       Jpg.ProgressiveEncoding := True; {True : good for web or slow computer}
       Jpg.Assign(Bmp);
       Jpg.SaveToFile(Sd2.filename);
       end
       finally
       Bmp.Free;
       Jpg.Free;
     end;
    end;
    Merci à toutes les suggestions.

    @+,

    cincap

  8. #8
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Citation Envoyé par cincap Voir le message
    Bonjour à toutes et à tous,

    @ Paul TOTH, merci pour la suggestion logique et que j'ai appliquée dans ma procédure de sauvegarde.

    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
     
    with Sd2 {or SaveDialog2}do begin
         Filter     := 'Bitmap (*.bmp)|*.bmp|Jpeg (*.jpeg;*.jpg)|*.jpg|' ;
         DefaultExt := '.bmp';
     
      Bmp := TBitmap.Create;
      Bmp.PixelFormat := pf32bit;
      Jpg := TJPEGImage.Create;
     
      try
      if not execute then exit else 
     
      if LowerCase(ExtractFileExt(Sd2.FileName)) = '.bmp' then
        begin
     
        Bmp.Assign(imagesource1.picture.bitmap);
        Bmp.PixelFormat := pf24bit;
       Bmp.SaveToFile(Sd2.filename);
      end;
     
      if LowerCase(ExtractFileExt(Sd2.FileName)) = '.jpg' then
        begin
       Bmp.Assign(imagesource1.picture.bitmap);
       Jpg.CompressionQuality  := 80; {75..85 : best ratio Size/Quality}
       Jpg.ProgressiveEncoding := True; {True : good for web or slow computer}
       Jpg.Assign(Bmp);
       Jpg.SaveToFile(Sd2.filename);
       end
       finally
       Bmp.Free;
       Jpg.Free;
     end;
    end;
    Merci à toutes les suggestions.

    @+,

    cincap

    Bonjour,

    tu peux te passer des variable "Bmp & Jpg" et l'utilisation
    d'un bloc try/finally/end n'est pas suffisant

    Si un problème survient à la création de TJPEGImage le TBitmap ne sera jamais libéré !

    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
      with Sd2 { or SaveDialog2 } do
      begin
        Filter := 'Bitmap (*.bmp)|*.bmp|Jpeg (*.jpeg;*.jpg)|*.jpg|';
        DefaultExt := '.bmp';
     
        if not execute then
          exit;
     
        if LowerCase(ExtractFileExt(Sd2.FileName)) = '.bmp' then
        begin
          with TBitmap.Create do
            try
              Assign(ImageSource1.picture.bitmap);
              PixelFormat := pf24bit;
              SaveToFile(Sd2.FileName);
            finally
              Free;
            end;
        end;
     
        if LowerCase(ExtractFileExt(Sd2.FileName)) = '.jpg' then
        begin
          with TJPEGImage.Create do
            try
              CompressionQuality := 80; { 75..85 : best ratio Size/Quality }
              ProgressiveEncoding := True; { True : good for web or slow computer }
              Assign(ImageSource1.picture.bitmap);
              SaveToFile(Sd2.FileName);
            finally
              Free;
            end;
        end
      end;

    Cordialement

    @+

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 436
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 436
    Points : 1 328
    Points
    1 328
    Par défaut
    @ Cirec, Comment vas tu ? et encore merci pour ta solution qui allège encore mon code et qui fonctionne correctement.

    Je me suis permis de le modifier un peu pour mettre aussi le format .jpeg en créant une variable ImgExt.

    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
    with Sd2 { or SaveDialog2 } do
      begin
        Filter := 'Bitmap (*.bmp)|*.bmp|Jpeg (*.jpeg;*.jpg)|*.jpg|';
        DefaultExt := '.bmp';
     
        if not execute then
          exit;
    
        ImgExt := LowerCase(ExtractFileExt(Sd2.FileName));
    
        if ImgExt = '.bmp' then
        begin
          with TBitmap.Create do
            try
              Assign(ImageSource1.picture.bitmap);
              PixelFormat := pf24bit;
              SaveToFile(Sd2.FileName);
            finally
              Free;
            end;
        end;
     
        if (ImgExt = '.jpg') or (ImgExt = '.jpeg') then
        begin
          with TJPEGImage.Create do
            try
              CompressionQuality := 80; { 75..85 : best ratio Size/Quality }
              ProgressiveEncoding := True; { True : good for web or slow computer }
              Assign(ImageSource1.picture.bitmap);
              SaveToFile(Sd2.FileName);
            finally
              Free;
            end;
        end
      end;
    @ +,

    cincap

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

Discussions similaires

  1. Problème de sauvegarde de fichier .jpg en utilisant PIL
    Par ZZAFAR dans le forum Général Python
    Réponses: 5
    Dernier message: 04/05/2018, 20h36
  2. [Lazarus] Lazarus 1.6 ne fonctionne pas après l'installation sous Windows 7 64 bits
    Par aimer_Delphi dans le forum Lazarus
    Réponses: 30
    Dernier message: 24/08/2016, 18h34
  3. Réponses: 2
    Dernier message: 22/08/2014, 20h08
  4. Réponses: 2
    Dernier message: 29/11/2012, 17h39
  5. Instabilité apres install BO31(Windows 2008 64 bits)
    Par asnif dans le forum Administration-Migration
    Réponses: 1
    Dernier message: 22/02/2010, 13h32

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