项目中需要用到调用打印机打印图片,原本觉得会很复杂,结果一搜索发现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中报错没有添加引用,则要对项目添加引用(关于这点,可以看看我之前的文章)