日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Delphi 精確打印Image畫布

 163九九 2016-08-06

最新Delphi 精確打印Image畫布

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

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

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

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

首先,需要一個(gè)放大比例:

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

(Printer.PageHeight div Image.Height);

 

為了居中顯示,還需要長(zhǎng)寬各方向的偏差:

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

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

 

 

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

以線段為例:

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

 

 

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

這里,我們需要迂回一下,先設(shè)置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) // 打印機(jī)Y方向分辨率

 

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

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


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

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多