Unity调用打印机打印图片
程序员文章站
2023-11-09 19:38:46
本文实例为大家分享了unity打印机打印图片的具体代码,供大家参考,具体内容如下
1、调用打印机首先就是要配置好打印机
就是电脑跟打印机已经连接好,有默认的打印机可以启动使用...
本文实例为大家分享了unity打印机打印图片的具体代码,供大家参考,具体内容如下
1、调用打印机首先就是要配置好打印机
就是电脑跟打印机已经连接好,有默认的打印机可以启动使用
2、调用方式
(1)使用外部第三方软件exe
代码如下:(就两句)
string path = application.datapath + @"\textures\002.png"; system.diagnostics.process.start("mspaint.exe", path);//调用第三方应用去打印(其中path是要打印图片的路径,而mspaint.exe是调用windows中的画板,然后从画板里启用打印功能)
(2)使用win自带软件
这个需要下载一个应用(应用会放在我的博客下载文件中名字是printimage.exe)
然后直接上代码:
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)自己进行打印
/// <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,原本插件是直接导入就可以的)。
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."); } } } }
这是实现功能的源码。调用方法如下:
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中报错没有添加引用,则要对项目添加引用
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。