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 :

Pb de conversion emf vers jpg de grandes images


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Par défaut Pb de conversion emf vers jpg de grandes images
    Bonsoir à tous,

    Je suis confronté au problème suivant lors de la conversion de grandes images emf vers jpg, j'obtiens une erreur endofressources:
    Pour réaliser cela, étant donné qu'il n'est pas possible de dessiner directement dans le jpg (il ne possède pas de canvas), j'utilise un bitmap intermédiaire suivant le code ci-dessous:
    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
     try
        MF := tmetafile.Create;
        MF.Enhanced := true;     MF.Width := largeur;    MF.Height := hauteur;
     
        MFcvs := TMetaFileCanvas.Create(mf, 0); //crée un canvas metafile
        fGraph.Dessine(mfcvs, positionLeft, positionTop); //dessine dans le metafilecanvas
        MFcvs .Free; //libère le mfcanvas et transfere dans metafile
     
        if MF <> nil then
          begin
            sExt := ExtractFileExt(sNomFich);  //récupère le format de fichier désiré
            if (sExt = '.bmp') or (sExt = '.jpg') then
              begin
                bmp := TBitmap.Create;
                try
                  bmp.PixelFormat := pf24bit;  bmp.Width := mf.Width;      bmp.Height := mf.Height;
                  bmp.Canvas.Draw(0, 0, mf);
     
                  if (sExt = '.bmp') then  bmp.SaveToFile(sNomFich);
     
                  if (sExt = '.jpg') then
                    begin
                      JPEG := TJPEGImage.Create;
                      try
                        JPEG.CompressionQuality := JpegCompr;
                        JPEG.Assign(bmp);
                        JPEG.JPEGNeeded;
                        JPEG.SaveToFile(sNomFich);
                      finally
                        JPEG.Free;
                      end;
                    end;
     
                finally
                  bmp.Free;
                end;
              end
           end;
      finally
        MF.Free;
      end;
    Mes questions:
    1- Existe-t'il une façon plus efficace pour réaliser cette conversion, n'utilisant pas éventuellement le bitmap qui génère le dépassement mémoire?
    2- peut-on éviter d'utiliser la mémoire pour réaliser celà? (en passant par le disque par exemple)
    3- est-ce que la notion de stream peut-être une piste?
    4- existe-t'il une solution permettent de réserver l'espace nécessaire pour stocker le bitmap? (pouvant éventuellement dépasser la capacité mémoire)

    ou toute autre idée, piste ou solution qui seront les bienvenues...

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Par défaut
    Personne n'a une même une toute petite idée ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Par défaut
    J'ai également fait l'essai d'affecter directement le MetaFile au Jpeg mais j'obtiens l'erreur: ' Impossible d'affecter TMetafile à TJPEGImage '

    Peux-t'on affecter un metafile a un jpeg? Si oui de quelle manière sans utiliser un bitmap intermédiaire ?

  4. #4
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut
    Bonjour.

    Peux tu dire à quel moment survient l'erreur (Execution en mode pas-à-pas) ?
    Il est bien possible que ce soit la méthode "Draw" qui plante.

    A+

  5. #5
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut
    J'avais proposé la méthode suivante pour charger et sauver des image JPEG. Mais la méthode "Draw" plante lamentablement avec de grandes image. J'ai modifier mon 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
     
    {-----------------------------------------------------------------}
    {                Charge une image au format JPEG                   }
    {-----------------------------------------------------------------}
    Procedure ChargeImageJPEG(Nom : String);
    Var
      ImageJPEG  : TJPEGImage;
      ImageBmp   : TBitMap;
    Begin
       If Not (UpperCase(ExtractFileExt(Nom)) = '.JPG') Then Exit;
       // Creéation de l'objet Image JPEG
       ImageJPEG:=TJPEGImage.Create;
       Try
         // Chargement de l'image JPEG
         ImageJPEG.LoadFromFile(Nom);
         // Création de l'objet BitMap
         ImageBmp:=TBitMap.create;
           Try
             ImageBMP.Width:=ImageJPEG.Width;
             ImageBMP.Height:=ImageJPEG.Height;
             ImageBMP.Canvas.Draw(0,0,ImageJPEG);
             // Transfert de l'image pour assurer une parfaite compatibilité
             ImageTmp.Picture.BitMap.Assign(ImageBMP);
           Finally
              ImageBMP.Free;
           end;
       Finally
           ImageJPEG.Free;
       end;
    End;
    J'ai trouvé la solution ainsi. Cela permet de gérer de grande images. C'est la technique que j'utilise danss mon programme de retouche de photo.
    Je viens de faire un test : Image compressée JPEG, 28 Mégapixels, 13 Moctets.

    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
     
    // Charger une image JPEG
    Var
       I          : Byte;
       ImageJPEG  : TJPEGImage;
       PictureTmp : TPicture;
       ImageBMP   : TBitMap;
     
     
    If Extension = '.jpg' Then
        begin
           ImageJPEG:=TJPEGImage.Create;
           Try
             ImageJPEG.OnProgress:=ProgressUpdate;
             ImageJPEG.LoadFromFile(NomFichier);
             QualiteJPG:=ImageJPEG.CompressionQuality;
     
             Image.Picture.BitMap.Assign(ImageJPEG);
     
           Finally
               ImageJPEG.Free;
           end;
     
          Result:=True;
        end;
    Et pour sauver :
    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
     
    Procedure TFicheManipImage.SauveImageJPEG(Nom : String;Qualite : Integer);
    Var
       Image  : TJPEGImage;
     
    Begin
       Err1:=False;
       If Qualite < 1 Then Qualite:=100;
       If Qualite > 100 Then Qualite:=100;
       Try
         Image:=TJPEGImage.Create;
         Image.Assign(Image1.Picture.BitMap);
         Image.CompressionQuality:=Qualite;
         Image.ProgressiveEncoding:=True;
         Image.SaveToFile(Nom);
         finally Image.Free;
       end;
    End;
    A+

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Par défaut
    J'ai tracé pour vérifier précisémment où se produit l'erreur, c'est en fait lors de l'affectation des tailles au bitmap, bitmap.width passe sans problème, mais bitmap.height déclenche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...classe d'exception EOutOfResources avec le message 'Espace insuffisant pour traiter cette commande...
    J'ai déja essayer jpeg.assign(bitmap), sans succès évidemment l'erreur étant préalble

    Avec jpeg.assign(metafile), erreur à la compilation: 'Impossible d'affecter TMetafile à TJPEGImage'

    Ce qui est curieux (pour moi ), c'est que si je ne réalise pas btimap.width et height, j'obtiens une erreur ressemblante 'Impossible d'affecter TMetafile à TBitmap' lors de bitmap.assign(mf)

    Dans tes exemples, tu utilises un image, peut-être devrais-je essayer avec un image.pisture.bitmap a la place du bitmap

Discussions similaires

  1. Conversion BMP vers JPG ou PNG
    Par toine92 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 31/03/2010, 11h25
  2. Conversion TIFF vers PNG ou JPG à la volée
    Par yellowsub122 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/03/2010, 22h00
  3. Conversion Unix vers DOS...
    Par nicosfly dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2008, 17h53
  4. [langage] conversion décimal vers hexa
    Par chipster dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2004, 16h05
  5. Conversion Timestamp vers varchar
    Par stejutt dans le forum SQL
    Réponses: 4
    Dernier message: 08/01/2004, 08h46

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