嗨伙伴我想要打印我生成的图片我使用以下代码
Printer.BeginDoc;
Printer.Canvas.Draw(0,0,img1.Picture.Bitmap);
Printer.EndDoc;
它可以工作,但它打印的图像非常小,我如何打印屏幕上显示的图像的实际尺寸?
非常感谢。
答案 0 :(得分:5)
您可以致电Canvas.StretchDraw()
。但是,要为结果做好准备,不要太令人印象深刻。尝试以这种方式缩放光栅图像将导致非常块状的结果。为了能够扩展到打印机分辨率,您需要矢量图像。
var
Scale: Integer;
...
Scale := Min(
Printer.PageWidth div Bitmap.Width,
Printer.PageHeight div Bitmap.Height
);
Printer.Canvas.StretchDraw(
Rect(0, 0, Bitmap.Width*Scale, Bitmap.Height*Scale),
Bitmap
);
我在此处选择的缩放将保留纵横比,并在打印时使图像尽可能大。
答案 1 :(得分:3)
如果使用JCL或Graphics32中的一个重新采样器将图像调整为中间位图(大小适合打印机分辨率),则应获得更好的效果,然后打印调整大小位图。
以下例程将尝试在打印机中获得与屏幕相同的大小:
uses
JclGraphics;
procedure PrintGraphic(source: TGraphic);
var
dest: TBitmap;
destWidth, destHeight,
printerPixelsPerInch_X, printerPixelsPerInch_Y,
printerLeftMargin, printerTopMargin: integer;
begin
printerPixelsPerInch_X := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
printerPixelsPerInch_Y := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
printerLeftMargin := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
printerTopMargin := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
dest := TBitmap.Create;
try
destWidth := source.Width * printerPixelsPerInch_X div Screen.PixelsPerInch;
destHeight := source.Height * printerPixelsPerInch_Y div Screen.PixelsPerInch;
Stretch(destWidth, destHeight, rfLanczos3, 0, source, dest);
Printer.BeginDoc;
try
Printer.Canvas.Draw(printerLeftMargin, printerTopMargin, dest);
Printer.EndDoc;
except
Printer.Abort;
raise;
end;
finally
dest.Free;
end;
end;
procedure TFormMain.Button1Click(Sender: TObject);
begin
if not PrinterSetupDialog.Execute then
exit;
PrintGraphic(Image1.Picture.Graphic);
end;
答案 2 :(得分:0)
TPrinter
有一个PixelsPerInch
或类似的属性,必须设置才能打印正确的分辨率。默认值与屏幕不匹配,这就是图像打印得如此之小的原因。使用TPrinter
的大多数新手都不知道设置属性。