Entwickler-Ecke

Multimedia / Grafik - TImage drucken -> Bild sehr klein


Alibi - Fr 07.02.03 16:27
Titel: TImage drucken -> Bild sehr klein
Hi,
ich habe ein Problem mit dem Ausdrucken von dem Canvas eines TImages.
So mach ich das momentan:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Diagrammdrucken1Click(Sender: TObject);
var
  DestRect: TRect;
begin
  DestRect.Left := 20;
  DestRect.Top := 20;
  DestRect.Right := Printer.PageWidth - 40;
  DestRect.Bottom := Printer.PageWidth - 40;
  Printer.BeginDoc;
  Printer.Canvas.CopyRect(DestRect,Image1.Canvas,Image1.Canvas.ClipRect);
  Printer.EndDoc;
End;

Nunja, aber durch das Skalieren mit CopyRect wird das Bild zwar schön groß, ist aber selbstveständlich stark verpixelt.
Skalier ich das nicht kommt ein Image, was 400x400 Pixel hat ca 3x3cm da raus, viel zu hohe Auflösung also.
Wie krieg ich nun ein 400x400 großes TImage auf ein DinA4 Blatt mit mindestens 10 cm Seitenlänge?


MathiasH - Fr 07.02.03 17:31

Hallo
da kommst du um das pixeln nicht herum, ausser du veränderst die Auflüsung des Druckers (bewirkt eigentlich das selbe, sieht aber besser aus).
Das ligt daran, dass die Auflösung eines Druckers um ein Vielfaches größer ist, als die des Bildschirms.

MathiasH


Alibi - Fr 07.02.03 18:17

Wie änder ich die Auflösung des Printers?
PageWidth und PageHeight ändern?


DaRkFiRe - Fr 07.02.03 19:48

Zuerst einmal musst Du rausfinden, wieviel Pixel 1 cm auf dem Drucker hat:


Quelltext
1:
2:
xdpi:=GetDeviceCaps(Printer.Handle,LOGPIXELSX)/2.54;
ydpi:=GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54;


Sagen wir mal, du willst Image1 auf dem Drucker ausgeben - und zwar an der Stelle X,Y und zwar mit den Abmaßen a x b


Quelltext
1:
2:
3:
Printer.BeginDoc;
Printer.Canvas.StretchDraw(RECT(X,Y,ROUND(X+Image1.Width/xdpi*a),ROUND(Y+Image1.Height/ydpi*b)),Image1.Picture.Graphic);
Printer.EndDoc;



Der Code sollte funktionieren - so skaliert man ein Bild zentimetergenau auf dem Drucker. Viel Spaß!


Alibi - Fr 07.02.03 22:35

Hi,
vielen dank, aber als ich für a und b jeweils 15 eingesetzt hab war das Bild sage und schreibe 0.5*0.5cm groß. :/


Aya - Sa 08.02.03 00:20

Hi,

mach es einfach so:


Quelltext
1:
Printer.Canvas.CopyRect(Rect(0,0,Printer.PageWidth,Printer.PageHeight),Image1.Canvas,Rect(0,0,Image1.Width,Image1.Height));                    


Au'revoir,
Aya


DaRkFiRe - Sa 08.02.03 02:03

@aya: Damit streckt man das Bild auf den ganzen Drucker.

@alibi: Sorry - mein Fehler:


Quelltext
1:
2:
3:
4:
5:
6:
xdpi:=GetDeviceCaps(Printer.Handle,LOGPIXELSX)/2.54; 
ydpi:=GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54; 

Printer.BeginDoc; 
Printer.Canvas.StretchDraw(RECT(X,Y,ROUND(X+xdpi*a),ROUND(Y+ydpi*b)),Image1.Picture.Graphic); 
Printer.EndDoc;


Damit sollte das Bild jetzt richtig gestreckt werden. Allerdings wird hierbei das Höhen-Breitenverhältnis nicht mit einbezogen. Bei weiteren Fragen einfach nochmal posten :) Nacht!


Alibi - Sa 08.02.03 02:24

Funktioniert, genauso verpixelt zwar wie mein erster Versuch, aber nicht schlimm, vielen dank an alle.


SevenValues - Mo 29.12.03 16:09

Hi!

Bin ich seit 08.02.2003 der Einzige, der laufend den Fehler

[Error] Unit1.pas(57): There is no overloaded version of 'Rect' that can be called with these arguments

bekommt?

Grüße
7