开发者

Printing real dimensions of an image

开发者 https://www.devze.com 2023-04-13 10:08 出处:网络
Hi mates i want to print a picture i generated i use the following code Printer.BeginDoc; Printer.Canvas.Draw(0,0,img1.Picture.Bitmap);

Hi mates i want to print a picture i generated i use the following code

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

I开发者_StackOverflowt works but the image it prints is very small how can i print the actual size of the image as it appears on the screen ?

Thanks very much.


You can call Canvas.StretchDraw() instead. However, be prepared for the results to be less than impressive. Trying to scale a raster image in this way will lead to very blocky results. Vector images are what you need in order to be able to scale to printer resolutions.

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
);

The scaling I chose here will preserve the aspect ratio and make the image as large as possible when printed.


You should achieve better results if you resize the image to an intermediate bitmap (with a size suitable for the printer resolution) using one of the resamplers in JCL or Graphics32 and then you print the resized bitmap.

The following routine will try to get the same size in printer as in the screen:

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;


IIRC (I don't have Delphi in front of me to check right now), TPrinter has a PixelsPerInch or similar property that has to be set so printing is at the correct resolution. The default value does not match the screen, which is why the image gets printed so small. Most newbies to using TPrinterdon't know to set the property.

0

精彩评论

暂无评论...
验证码 换一张
取 消