美文网首页C语言程序园
C# 图片打印杂谈

C# 图片打印杂谈

作者: 编程小世界 | 来源:发表于2019-06-17 20:05 被阅读0次

打印:PrintDocument

环境:WPF and Winform

要求:排版并打印图片

之前一直不明白很多参数的问题,现在想清楚了,随手记录一下。

WPF暂放一边,把winform先解决了,跟百度烂大街的一样是 PrintPage事件Graphics绘制来打印的。

首先用Graphics绘制一直不明白的是该怎么绘制,纸张的大小是多少,怎么样才能按照指定尺寸打印。

//我们先聊聊纸张大小,看纸张大小可以在开始文件打印PrintDocument.Print();

并选好打印机后,在 PrintPage事件里绘制要打印的数据

privatevoidpdControl_PrintPage(objectsender, PrintPageEventArgs e){varprintDocument = (PrintDocument)sender;//纸张的高和宽varpaper_h = printDocument.DefaultPageSettings.PaperSize.Height;varpaper_w = printDocument.DefaultPageSettings.PaperSize.Width;}

然而知道高和宽但不知道单位啊,这高和宽到底是像素还是英寸还是其它的什么鬼。

在实例化new PaperSize就看得到注释:

百分之一英寸为单位

这样第一个问题就解决了,纸张的大小是 printDocument.DefaultPageSettings.PaperSize,并且单位是百分之一英寸。

不过不要太相信这个,比如我要打印的图片是6寸的(特地量了),但给出是尺寸宽多了0.15In,高多了0.13In。好歹win自带的PDF打印A4纸也就相差0.002以下好吧。这个为什么有误差待大神解释。

那么第二个问题(第三个):该怎么绘制才能按照指定尺寸打印

既然我们知道了打印的范围也就避免了绘制超出纸张。那么我们就要绘制内容了,咱这只讲图片,其它的也差不多。

我做的是根据图片的大小铺满整个打印纸。

//我们先建个类,来记录要图片大小及纸张大小//这个类只是方便调试转换度量单位,实际应用只选一种计算单位就行了classPrintUnit{//图片大小,这里图片其实是一寸的照片publicintunit_w =259;publicintunit_h =377;//纸张大小300dpi 6*300 4*300publicPaperSize paperSize =newPaperSize("A6",1800,1200);//度量单位privateGraphicsUnit unit = GraphicsUnit.Pixel;publicGraphicsUnit Unit        {get=> unit;set{                unit =value;//如果度量单位为毫米if(unit == GraphicsUnit.Millimeter)                {//具体换算为 1200/300*25.4 约等于 102paperSize.Height =102;                    paperSize.Width =152;                    unit_w =22;                    unit_h =32;                }            }        }    }

然后在 PrintPage事件里得到计算打印纸可以铺满多少图片

PrintUnitprintUnit = new PrintUnit();        g.PageUnit =printUnit.Unit;        column =printUnit.paperSize.Width /printUnit.unit_w;            row =printUnit.paperSize.Height /printUnit.unit_h;for(int i = 0; i < row; i++)            {for(int j = 0; j < column; j++)                {                    //g.DrawImage(                    //    Resources._1,                    //    new Rectangle(j *printUnit.unit_w, i *printUnit.unit_h,printUnit.unit_w,printUnit.unit_h),                    //    new Rectangle(0, 0, Resources._1.Width, Resources._1.Height),                    //    g.PageUnit);                    g.DrawImage(Resources._1, j *printUnit.unit_w, i *printUnit.unit_h,printUnit.unit_w,printUnit.unit_h);                }            }

有趣的是在DrawImage(Image image, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit);的重载方法里图片有误差,原因不明。

有点乱了,来强行解释一波。

在打印事件里PrintPageEventArgs.PageUnit 是设置度量单位,就是你要绘制的单位是按照像素还是毫米或其它,默认是百分之一英寸。

//比如你要打印A4纸210mm×297mm ,打印PrintPage事件里设置度量单位为Millimeterg.PageUnit=GraphicsUnit.Millimeter;//铺满整个A4纸g.DrawImage(image,0,0,210,297);

就是这么简单,不过不建议用毫米为单位,因为这样图片容易误差,这是因为绘制时会将毫米转换成像素。

很明显用毫米来绘制时会有间隙

懒得排版,事多,溜了溜了。

如果有想学习c++的程序员,可来我们的C/C++学习扣qun:589348389,

微信公众号:java大世界(现在是发布c++学习干货哦,没有java)

免费送C++的视频教程噢!

我每晚上8点还会在群内直播讲解C/C++知识,欢迎大家前来学习哦。

相关文章

  • C# 图片打印杂谈

    打印:PrintDocument 环境:WPFand Winform 要求:排版并打印图片 之前一直不明白很多参数...

  • C# 实现图片打印

    打印的原理是:生成mdi文件,系统碰到mdi的时候会自动以打印的方式处理。所以,不管用什么模板,什么方式;能在Pr...

  • C#图形文字打印预览的实例

    一、C#窗体打印组件 Windows 窗体中的打印主要包括: 使用PrintDocument 组件来使用户能够打印...

  • 关于杨辉三角

    获取第n行第m个数字 JavaScript版: C#版 打印杨辉三角C#版:

  • 2018-12-08

    C#知识点部分总结 1、 Console.WriteLine():打印到控制台并换行   2、 C#类型:值类型、...

  • kernel打印杂谈

    内核打印基本规则# dev_info()启动过程、或者模块加载过程等“通知类的”信息等,一般只会通知一次,例如pr...

  • iOS如何完成蓝牙打印机功能

    写在前面:因为哥们 @骑驴追蝴蝶 遇到了打印图片的功能,这个demo 是支持打印图片的,打印图片代码我单独放在文章...

  • 怎么把邮箱PDF格式图片打印成A4大小?

    今天准备打印邮箱里的图片,为了减少内存,决定不下载图片在打印,可是不下载图片想打印A4大小的文件,页面显示...

  • 图片懒加载与预加载

    图片预加载应用创建,前端打印图片,需要所有图片都加载完毕才能打印(增加服务端压力)varimgLoad =func...

  • winform打印控件鼠标滚轴问题

    我们发现本身c#自带打印预览窗口可以预览,但是鼠标滚轴滑动无法跟随,固实现自定义打印预览控件来实现,废话不多说,上...

网友评论

    本文标题:C# 图片打印杂谈

    本文链接:https://www.haomeiwen.com/subject/oiwzfctx.html