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 :

Un Qreport en Jpeg


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Un Qreport en Jpeg
    Bonjour,

    Le but de ma fonction est de générer un JPEG à partir des metafiles contenus dans mon objet QuickReport.

    voici la fonction :

    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
    procedure ExportToJPEGStream(AReport: TQuickRep; AStream: TStream);
    var aMeta             : TMetaFile;
        PageNum,MaxPage : integer;
        AWidth, AHeight   : Integer;
        MonBMP : TBitmap;
        Jpg: TJPEGImage;
        ImageEnProc    :  TImageEnProc;
        Ratio          :  Extended;
        NHeight        :  Integer;
        NewWidth, NewHeight,Oldheight : integer;
     
    begin
         MonBMP := TBitmap.create;
         Jpg := TJPEGImage.Create;
         ImageEnProc := TImageEnProc.Create (nil);
         try
          AReport.PrepareExportMetafile;
          MaxPage := Areport.QRPrinter.PageCount;
          MonBMP.Height := 0;
          Jpg.Performance := jpBestQuality;
          Jpg.CompressionQuality := 90;
          for PageNum := 1 to MaxPage do
           begin
                 aMeta := Areport.QRPrinter.GetPage(PageNum);
                 if assigned(ameta) then
                    begin
                         try
                            Oldheight := MonBMP.Height;
                            MonBMP.PixelFormat := pf24bit;
                            MonBMP.Width := ameta.Width;
                            MonBMP.Height := MonBMP.Height + ameta.Height;
                            MonBMP.Canvas.Draw(0,Oldheight, ameta);
                         finally
                            aMeta.Free;
                         end;
                    end;
     
           end;
         if MonBMP.Width > 0 then
         begin
               NewWidth := 800;
               NewHeight := -1;
               Jpg.Performance := jpBestQuality;
               Jpg.CompressionQuality := 90;
               Ratio := MonBMP.Height/MonBMP.Width;
               NHeight := Round(Ratio * NewWidth);
               ImageEnProc.AttachedBitMap := MonBMP;
               ImageEnProc.Resample(NewWidth, NewHeight, rfMitchell);
               MonBMP.Width := NewWidth;
               MonBMP.Height := NHeight;
     
               Jpg.Assign(MonBMP);
               Jpg.savetoStream(Astream);
         end;
         finally
                MonBMP.free;
                jpg.free;
                ImageEnProc.Free;
         end;
     
    end;

    Comme vous le constater mon but est de récuperer l'image sous une résolution de 800 x YYY afin qu'elle puisse etre facilement exploitable.
    cela fonctionne très bien, mais le problème est que la fonction ReSample est super longue et pénalise beaucoup le reste de mon programme. Connaissez vous un moyen d'optimiser, ou une autre moulinette pour mon besoin ?

    Cordialement.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Tu ne nous montre pas le code de cette fonction, donc difficile à dire s'il y a plus rapide ! Mais j'utiliserais StretchBlt.

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    dsl ce n'est pas une fonction mais une procédure... et elle est dans le poste.

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    les Qreport contiennent des metafile (un metafile par page) je récupere donc un à un les metafile et je les combinent pour faire une image unique en sortie

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Je vois bien où elle est utilisée, mais pas où elle est déclarée .

    Maintenant, tu pourrais aussi tout faire en une étape en remplaçant Draw par StretchDraw.

    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
    ...
    PageWidth := 800;
    MonBMP.PixelFormat := pf24bit;
     
    for PageNum := 1 to MaxPage do
    begin
      aMeta := Areport.QRPrinter.GetPage(PageNum);
     
      if assigned(aMeta) then
      begin
        //Initialisation (1ère page seulement)
        if PageNum = 1 then
        begin
          Ratio      := PageWidth /aMeta.Width;
          PageHeight := Trunc(aMeta.Height *Ratio);
          R          := Rect(0, 0, PageWidth, PageHeight);
          MonBMP.SetSize(PageWidth, PageHeight *MaxPage);
        end;
     
        //Copie
        try
          MonBMP.Canvas.StretchDraw(R, aMeta);
        finally
          aMeta.Free;  //Est-ce nécessaire ?!?
        end;
     
        //Décalage (Page suivante)
        OffsetRect(R, 0, PageHeight);
      end;
    end;
    ...

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Désolé, je crois que l'on ne parlait pas de la même fonction, tu parlais de Resample ? C'est une fonction de mon objet TimageEnproc (composant imageen), voici le code mais ca ne te servira pas à grand chose je pense.

    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
    procedure TImageEnProc.Resample(NewWidth, NewHeight: integer; FilterType: TResampleFilter);
    var
      newbitmap: TIEBitmap;
    begin
      {$ifdef IEPROFILE} try IEProfileBegin('TImageEnProc.Resample'); {$endif}
      if not MakeConsistentBitmap([]) then
        exit;
      if (fIEBitmap.Width = 0) or (fIEBitmap.Height = 0) then
        exit;
      if fAutoUndo then
        SaveUndoCaptioned('Resample ' + inttostr(NewWidth) + ',' + inttostr(NewHeight), ieuImage);
      //
      newbitmap := TIEBitmap.create;
      ResampleTo(newbitmap, NewWidth, NewHeight, FilterType); // ResampleTo resizes the bitmap and set pixelformat
      fIEBitmap.assign(newbitmap);
      FreeAndNil(newbitmap);
      //
      Update;
      DoFinishWork;
      {$ifdef IEPROFILE} finally IEProfileEnd; end; {$endif}
    end;

    Sinon ta proposition est intéressante je vois où tu veux en venir mais la procedure setSize n'existe pas sur mon TBitmap

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    ...mais le problème est que la fonction ReSample est super longue et pénalise beaucoup le reste de mon programme.
    Pourtant c'est bien de cette procédure que tu parlais dans ton 1er post .
    Mis à part, je ne vois pas l'avantage de cette procédure par rapport à un simple StretchDraw.

    Remplace simplement SetSize par MonBmp.Width et MonBmp.Height.

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    En faites j'utilise le resample pour reduire la résolution/taille de mon image sans la déteriorer.
    Je viens d'essayer ton idée, fonctionne impeccable !

    Je te remercie beaucoup de t etre pencher sur mon problème !!!

    je cloture donc

    Bien cordialement

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

Discussions similaires

  1. Comment convertir un Jpeg en .ico
    Par Valéry dans le forum Outils
    Réponses: 5
    Dernier message: 04/07/2003, 09h43
  2. [TP] gif et jpeg
    Par vinyl74 dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 22/12/2002, 15h02
  3. Réponses: 5
    Dernier message: 20/08/2002, 18h01
  4. Copier une image (jpeg) dans le presse papier
    Par benj63 dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/07/2002, 14h51
  5. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 20h06

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