打印图像的实际尺寸

时间:2011-10-15 12:39:50

标签: delphi printing

嗨伙伴我想要打印我生成的图片我使用以下代码

  Printer.BeginDoc;
  Printer.Canvas.Draw(0,0,img1.Picture.Bitmap);
  Printer.EndDoc;

它可以工作,但它打印的图像非常小,我如何打印屏幕上显示的图像的实际尺寸?

非常感谢。

3 个答案:

答案 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)

如果使用JCLGraphics32中的一个重新采样器将图像调整为中间位图(大小适合打印机分辨率),则应获得更好的效果,然后打印调整大小位图。

以下例程将尝试在打印机中获得与屏幕相同的大小:

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)

IIRC(我现在没有在我面前检查Delphi),TPrinter有一个PixelsPerInch或类似的属性,必须设置才能打印正确的分辨率。默认值与屏幕不匹配,这就是图像打印得如此之小的原因。使用TPrinter的大多数新手都不知道设置属性。