Printing real dimensions of an image

后端 未结 3 1870
半阙折子戏
半阙折子戏 2021-01-06 21:23

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         


        
相关标签:
3条回答
  • 2021-01-06 21:26

    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;
    
    0 讨论(0)
  • 2021-01-06 21:31

    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 讨论(0)
  • 2021-01-06 21:35

    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.

    0 讨论(0)
提交回复
热议问题