Impression d'une image

Résolu
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 - 20 janv. 2008 à 11:45
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 - 20 janv. 2008 à 20:16
Bonjour,

J'aimerais savoir s'il existe une fonction rapide pour imprimer un TImage sur une imprimante tout en faisant une mise à l'échelle.
En effet, j'ai un petit logiciel qui posséde un TImage que j'aimerais imprimer.
La solution que j'applique est :

if FMain.PrintDialog1.Execute then
     begin

       Printer.BeginDoc;
       ech1:=Printer.PageWidth/FMain.ImageTrace.Width;
       ech2:=Printer.PageHeight/FMain.ImageTrace.Height;
       if ech1>ech2 then ech:=ech1 else ech:=ech2;
       Long:=trunc(FMain.ImageTrace.Width*ech);
       larg:=trunc(FMain.ImageTrace.Height*ech);
       for x:=0 to long-1 do
         begin
           x1:=trunc(x/ech);
           For y:=0 to larg-1 do
             begin
               y1:=trunc(y/ech);
               if (x1<FMain.ImageTrace.Width)
                  and (y1<FMain.ImageTrace.Height) then
                  Printer.Canvas.Pixels[x,y]:=FMain.ImageTrace.Canvas.Pixels[x1,y1];
             end;

         end;
       Printer.EndDoc;
     end;   

ech permet de faire la mise à l'échelle entre le TImage et l'imprimante.

Mon gros probléme c'est que si je ne fais pas de mise à l'échelle, j'imprime un timbre poste (ca peut être utile pour envoyer une lettre lol...) mais avec ma procédure, ca prend pas loin de 20 minutes pour imprimer mon image sur PDFCreator. L'impression est correcte mais pas très rapide.

Merci pour vos réponses...

Oniria

2 réponses

Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 3
20 janv. 2008 à 20:16
Bonsoir,

En tout cas, merci beaucoup pour le temps que tu as passé pour me répondre. J'ai appris une nouvelle fonction : ScanLine.

J'ai trouvé une fonction sympa pour ce que je voulais faire : StretchDraw. Elle s'occupe de tout, la mise à l'échelle de l'image dans une zone prédéfinie.

Ma fonction d'impression est la suivante :

var x,y,x1,y1,long,larg : integer;
    ech1,ech2,ech : real;
    rect : TRect;
begin
  if FMain.PrintDialog1.Execute then
     begin

       Printer.BeginDoc;
       ech1:=Printer.PageWidth/FMain.ImageTrace.Width; // echelle sur l'axe des abscisses
       ech2:=Printer.PageHeight/FMain.ImageTrace.Height;// echelle sur l'axe des ordonnées
       if ech1<ech2 then ech:=ech1 else ech:=ech2; // on choisit l'échelle la plus petite
       Long:=trunc(FMain.ImageTrace.Width*ech); // on défini la taille en longueur de l'image sur la page
       larg:=trunc(FMain.ImageTrace.Height*ech); // on défini la largeur de l'image sur la page
       rect.Top:=0; // rect défini la zone ou se retrouve l'image
       rect.Bottom:=larg;
       rect.Left:=0;
       rect.Right:=long;
       Printer.Canvas.StretchDraw(rect,FMain.ImageTrace); // on trace l'image
       Printer.EndDoc;
     end;
end;  

Avec cette procédure, le tracé ne prend que quelques secondes. D'ou un gain de temps énorme.

Merci pour tes réponse Cirec, c'est vraiment très sympa.

Oniria
3
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 3
20 janv. 2008 à 19:07
Bonjour Cirec,

J'en conviens, je n'ai pas répondu ni accepté les réponses car les réponse ne me conviennent pas vraiment (le transfert doit prendre en compte un facteur de zoom de même qu'une région particulière de l'image source). Et le Scanline analyse une ligne compléte. Mais pour la copie dans l'image de destination, comment prendre en compte un facteur de zoom.

Dans le premier cas, je parlais d'un TImage, là, je parle du TPrinter. Je pense sincérement que je doit me planter quelque part car les logiciels de traitement d'image ne mettent pas autant de temps pour imprimer (même avec des adaptations de dimension de l'image à imprimer par rapport à la page). J'ai du louper quelque chose mais je ne vois pas quoi.

En tout cas merci.

Oniria
0
Rejoignez-nous