电竞比分网-中国电竞赛事及体育赛事平台

分享

Delphi 精確打印Image畫布

 163九九 2016-08-06

最新Delphi 精確打印Image畫布

以下是三零網(wǎng)為大家整理的最新Delphi 精確打印Image畫布的文章,希望大家能夠喜歡!

 最近在做一個打印報告的小軟件,里面需要將Image上顯示的東西,按照“所見即所得”的原則打印出來。

好吧,最直接的方法當然是把Image的畫布以圖片的形式輸出,這樣既不用考慮畫布上信息之間的相對位置,操作又簡單。不過這樣操作有個硬傷:圖片失真。因為打印機分辨率的關系,需要在打印時將畫布上的信息放大,才能匹配打印機的畫布,這樣難免會造成文字信息的拉伸變形。而且,使用圖片打印的話,需要傳輸?shù)酱蛴C的數(shù)據(jù)就會幾何倍增多,影響打印效率(這里還有一個問題,Delphi的Printer打印圖形時,如果直接使用 canvas.stretchdraw 函數(shù)的話,在有的機器或者打印機上運行時會出錯,很不穩(wěn)定。需要處理后才能正常打印,網(wǎng)上有一段直接打印位圖的代碼,可以參考下)。考慮到這些因素,在完成最初的版本之后,又重新選擇直接在打印機畫布上“作畫”的方式。

最初的原則不變,那么從效果上來說還是一樣,還是需要放大的過程。打開VCL,我們發(fā)現(xiàn) Printer單元封裝了大量的有關打印機操作的API函數(shù)(這句是廢話..), 我們在需要獲得打印機畫布信息時,可以很方便的直接調(diào)用屬性。

首先,需要一個放大比例:

lMultiple:= Min(Printer.PageWidth div Image.Width,

(Printer.PageHeight div Image.Height);

 

為了居中顯示,還需要長寬各方向的偏差:

lLeft:= (Printer.PageWidth - Image.Width * lMultiple) div 2;

lTop := (Printer.PageHeight - Image.Height* lMultiple) div 2;

 

 

先來講一下線段、矩形框之類的圖形輸出,這一類比較簡單,只要定位好坐標就可以。

以線段為例:

Pen.Width:=PenSize*lMultiple; // 線寬放大

Pen.Style:= psSolid;

MoveTo(PointA.X*lMultiple+lLeft, PointA.Y*lMultiple+lTop);

LineTo(PointB.X*lMultiple+lLeft, PointB.Y*lMultiple+lTop);

 

 

遇到文字信息時,首先,其坐標設置與線段相同,不過在字體大小設置時,為了像原畫布上那樣,與線段、矩形框這些元素保持相對位置不變,勢必不能使用原始大小。但是像線寬那樣Font.Size:= FontSize * lMultiple; 的話,打印出來的就是大字報了。那么該如何設置呢?

這里,我們需要迂回一下,先設置Printer.Canvas.Font.Height 屬性,方法是:

Image.Canvas.Font.Size:= TextSize ; // 原始字體尺寸

Image.Canvas.Font.Name:= Trim(StrPas(@.TextStyle)); // 原始字體樣式

Font.Height:= Image.Canvas.TextHeight('|')* lcMultiple; // 比例放大Height屬性

Font.Size:= Round( - Font.Height * 72 / Font.PixelsPerInch);

// 這里的 Font.PixelsPerInch 等效于

// GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) // 打印機Y方向分辨率

 

(如果涉及到多行打印,自動換行問題,需要用到 DrawText 函數(shù),一些設置問題尚在測試中,完成了再拿出來與大家分享)

如此這般,就可以比較精確的實現(xiàn)單行文本輸出了,在Delphi6上測試通過。以上是筆者的一點愚見,如有不當之處,還請不吝賜教,歡迎討論。


延伸閱讀:
·Delphi 打印TDBGrid 內(nèi)容代碼
·Delphi檢測系統(tǒng)安裝的打印機
·Delphi調(diào)用ImageMagickObject進行圖片轉換的代碼
·Delphi通過Com+調(diào)用ImageMagick的范例代碼
·delphi打印TImage圖片
·Delphi在畫布上繪制文字輪廓
·Delphi在畫布上繪制文本

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多