Impression d'une image [Résolu]

Messages postés
297
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
18 décembre 2014
- - Dernière réponse : Oniria
Messages postés
297
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
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
297
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
18 décembre 2014
2
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 120 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Oniria
Messages postés
4233
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 juillet 2019
32
0
Merci
Salut,

Premièrement on attend toujours encore une réponse de ta part ici
ensuite tu reviens avec le même type de question ... donc attends-toi à avoir les mêmes réponses

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec
Messages postés
297
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
18 décembre 2014
2
0
Merci
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
Commenter la réponse de Oniria
Messages postés
4233
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
3 juillet 2019
32
0
Merci
La solution que je t'ai donné ici peut également s'adapter pour l'impression

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec