delphi 怎样利用打印机画布来做水印

 我来答
龙氏风采
2017-11-16 · 知道合伙人互联网行家
龙氏风采
知道合伙人互联网行家
采纳数:5849 获赞数:12817
从事互联网运营推广,5年以上互联网运营推广经验,丰富的实战经

向TA提问 私信TA
展开全部
最新Delphi 精确打印Image画布
以下是三零网为大家整理的最新Delphi 精确打印Image画布的文章,希望大家能够喜欢!
最近在做一个打印报告的小软件,里面需要将Image上显示的东西,按照“所见即所得”的原则打印出来。
好吧,最直接的方法当然是把Image的画布以图片的形式输出,这样既不用考虑画布上信息之间的相对位置,操作又简单。不过这样操作有个硬伤:图片失真。因为打印机分辨率的关系,需要在打印时将画布上的信息放大,才能匹配打印机的画布,这样难免会造成文字信息的拉伸变形。而且,使用图片打印的话,需要传输到打印机的数据就会几何倍增多,影响打印效率(这里还有一个问题,Delphi的Printer打印图形时,如果直接使用 canvas.stretchdraw 函数的话,在有的机器或者打印机上运行时会出错,很不稳定。需要处理后才能正常打印,网上有一段直接打印位图的代码,可以参考下)。考虑到这些因素,在完成最初的版本之后,又重新选择直接在打印机画布上“作画”的方式。
最初的原则不变,那么从效果上来说还是一样,还是需要放大的过程。打开VCL,我们发现 Printer单元封装了大量的有关打印机操作的API函数(这句是废话..), 我们在需要获得打印机画布信息时,可以很方便的直接调用属性。
首先,需要一个放大比例:
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方向分辨率
博思aippt
2024-07-20 广告
作为深圳市博思云创科技有限公司的工作人员,对于Word文档生成PPT的操作,我们有以下建议:1. 使用另存为功能:在Word中编辑完文档后,点击文件->另存为,选择PowerPoint演示文稿(*.pptx)格式,即可将文档内容转换为PPT... 点击进入详情页
本回答由博思aippt提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式