Oniria
Messages postés292Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention18 décembre 2014
-
20 janv. 2008 à 11:45
Oniria
Messages postés292Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention18 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.
Oniria
Messages postés292Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention18 décembre 20143 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
Messages postés292Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention18 décembre 20143 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.