-
C#教程之Unity调用打印机打印图片
本站最新发布 C#从入门到精通
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
本文实例为大家分享了Unity打印机打印图片的具体代码,供大家参考,具体内容如下
1、调用打印机首先就是要配置好打印机
就是电脑跟打印机已经连接好,有默认的打印机可以启动使用
2、调用方式
(1)使用外部第三方软件exe
代码如下:(就两句)
1
2
|
string path = Application.dataPath + @"\Textures\002.png" ; System.Diagnostics.Process.Start( "mspaint.exe" , path); //调用第三方应用去打印(其中path是要打印图片的路径,而mspaint.exe是调用Windows中的画板,然后从画板里启用打印功能) |
(2)使用win自带软件
这个需要下载一个应用(应用会放在我的博客下载文件中名字是PrintImage.exe)
然后直接上代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
public void Test() { string path = Application.dataPath + @"\Textures\002.png,0,0,750,400" ; //从纸张的0. 0点,将图像调整为750×350点(计算:150mm/28.346 px/cm=529点,100mm/28.346 pm/cm=352点) 图片路径 string exepath = Application.streamingAssetsPath + @"\PrintImage.exe" ; //这个是需要下载的应用直接放到电脑上就行(调用打印机打印图片应用的路径) ProcessStartInfo info = new ProcessStartInfo(exepath); //指定启动进程时使用的一组值 info.Arguments = path; //获取或设置启动应用程序时要使用的一组命令行自变量 using (Process p= new Process()) { p.StartInfo = info; p.Start(); } } |
(3)自己进行打印
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
/// <summary> /// 打印 /// </summary> public void PrintFile() { PrintDocument pri = new PrintDocument(); pri.PrintPage += Printpagetest; pri.Print(); } private void Printpagetest( object sender, PrintPageEventArgs e) { try { System.Drawing.Image image = System.Drawing.Image.FromFile(printPath); System.Drawing.Graphics g = e.Graphics; g.TranslateTransform(_4AHeight, 0); g.RotateTransform(90); g.DrawImage(image, 0, 0, _4AWidth, _4AHeight); } catch (Exception ee) { Debug.LogError(ee.Message); } } |
(这里的第三种我还未进行测试,如出现错误无法实现请指正)
这里我选择的是第二种,1不好实现静默,3太麻烦,2使用是后台调用命令行
3、颜色问题
同时这里本人还找到了有博主自己写的调用打印机方法
项目中需要用到调用打印机打印图片,原本觉得会很复杂,结果一搜索发现Assetstore有相应的插件。在网上找到别人分享的插件,完美的实现了功能,所以现在也来分享一下(因为想看到具体实现,所以用工具反编译了DLL,原本插件是直接导入就可以的)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
using System; using System.Diagnostics; using System.Drawing.Printing; using System.IO; using UnityEngine; namespace LCPrinter { public static class Print { public static void PrintTexture( byte [] texture2DBytes, int numCopies, string printerName) { if (texture2DBytes == null ) { UnityEngine.Debug.LogWarning( "LCPrinter: Texture is empty." ); return ; } PrinterSettings printerSettings = new PrinterSettings(); if (printerName == null || printerName.Equals( "" )) { printerName = printerSettings.PrinterName; UnityEngine.Debug.Log( "LCPrinter: Printing to default printer (" + printerName + ")." ); } string str = string .Concat( new string [] { DateTime.Now.Year.ToString(), "-" , DateTime.Now.Month.ToString(), "-" , DateTime.Now.Day.ToString(), "-" , DateTime.Now.Hour.ToString(), "-" , DateTime.Now.Minute.ToString(), "-" , DateTime.Now.Second.ToString(), "-" , DateTime.Now.Millisecond.ToString() }); string text = (Application.persistentDataPath + "\\LCPrinterFiletmp_" + str + ".png" ).Replace( "/" , "\\" ); UnityEngine.Debug.Log( "LCPrinter: Temporary Path - " + text); File.WriteAllBytes(text, texture2DBytes); Print.PrintCMD(text, numCopies, printerName); } public static void PrintTextureByPath( string path, int numCopies, string printerName) { PrinterSettings printerSettings = new PrinterSettings(); if (printerName == null || printerName.Equals( "" )) { printerName = printerSettings.PrinterName; UnityEngine.Debug.Log( "LCPrinter: Printing to default printer (" + printerName + ")." ); } Print.PrintCMD(path, numCopies, printerName); } private static void PrintCMD( string path, int numCopies, string printerName) { Process process = new Process(); try { for ( int i = 0; i < numCopies; i++) { process.StartInfo.FileName = "rundll32" ; process.StartInfo.Arguments = string .Concat( new string [] { "C:\\WINDOWS\\system32\\shimgvw.dll,ImageView_PrintTo \"" , path, "\" \"" , printerName, "\"" }); process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; process.StartInfo.UseShellExecute = true ; process.Start(); } } catch (Exception arg) { UnityEngine.Debug.LogWarning( "LCPrinter: " + arg); } finally { process.Close(); UnityEngine.Debug.Log( "LCPrinter: Texture printing." ); } } } } |
这是实现功能的源码。调用方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
using UnityEngine; using System.Collections; using System.Diagnostics; using System; using System.IO; using LCPrinter; using UnityEngine.UI; public class LCExampleScript : MonoBehaviour { public Texture2D texture2D; public string printerName = "" ; public int copies = 1; public InputField inputField; public void printSmileButton() { Print.PrintTexture(texture2D.EncodeToPNG(), copies, printerName); //打印一张编辑器中的图片 } public void printByPathButton() { Print.PrintTextureByPath( "D:\\pic.png" , copies, printerName); //打印一张存在指定路径的图片 } } |
由于原本插件是添加好引用的,反编译之后缺少了引用,所以要去统一的安装路径E:\ unity5.3.2 \统一\编辑\数据\单声道\ lib中\单\ 2.0(这是我本地安装的路径)中找到System.Drawing.dll程序程序放入项目中的插件下。如在VS中报错没有添加引用,则要对项目添加引用
栏目列表
最新更新
C# 面向对象
假设客车的座位数是9行4列,使用二维数
C#基于接口设计三层架构Unity篇
C#线程 入门
C#读取静态类常量属性和值
C# 插件式编程
C# 委托与事件有啥区别?
C#队列学习笔记:队列(Queue)和堆栈(Stack
linq 多表分组左连接查询查询统计
C#队列学习笔记:MSMQ入门一
C# 在Word中添加Latex 数学公式和符号
inncheck命令 – 检查语法
基于UDP的服务器端和客户端
再谈UDP和TCP
在socket编程中使用域名
网络数据传输时的大小端问题
socket编程实现文件传输功能
如何优雅地断开TCP连接?
图解TCP四次握手断开连接
详细分析TCP数据的传输过程
SqlServer 利用游标批量更新数据
BOS只读状态修改
SQL Server等待事件—PAGEIOLATCH_EX
数据库多行转换为单一列
获取数据表最后最后访问,修改,更新,
计算经历的时间
SQL查询结果自定义排序
修改数据库默认位置
日期简单加或减
从日期获取年,月或日