2011-10-15 83 views
3

嗨队友我想打印的图片我生成我使用下面的代码印刷图像的实际尺寸

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

它的工作原理,但它打印的图像是非常小的我怎么能打印的实际大小它出现在屏幕上的图像?

非常感谢。

+0

如果你产生“使用的是Windows GDI的“图像”,那么唯一合理的解决办法是“产生”而是直接在打印机的画布​​上。如果要分离这两个过程,请生成一个EMF并将其“播放”到打印机的画布​​上。 –

回答

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

我在这里选择的缩放比例将保持宽高比,并在打印时使图像尽可能大。

+0

它不像它出现在屏幕上,而是一个起点。谢谢+1 – opc0de

+0

对于光栅图像,您不会像在屏幕上那样显示它。打印机的屏幕分辨率高出5-10倍。 –

+3

@Downvoter你介意告诉我为什么你觉得这个答案“没用”? –

0

IIRC(我没有德尔福在我面前检查现在),TPrinter有一个PixelsPerInch或类似的属性,必须设置打印是在正确的分辨率。默认值与屏幕不匹配,这就是为什么图像打印得太小。大多数使用TPrinter的新手不知道设置属性。

+0

嗯,我会检查出来。感谢提示 – opc0de

+0

“TPrinter”中没有'PixelsPerInch'。你是否想过'TFont.PixelsPerInch'。 –

+1

Nah;他正在考虑'GetDeviceCaps(Printer.Handle,LOGPIXELSX)'(或'LOGPIXELSY')。请参阅[这里](http://msdn.microsoft.com/en-us/library/dd144877(v = VS.85).aspx)。不过,我会使用'SCALEFACTORX'(或'Y')作为标志参数。 –

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;