Unity调用打印机打印图片
作者:月夜风雨磊 发布时间:2023-10-18 03:49:48
标签:Unity,打印机,打印
本文实例为大家分享了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中报错没有添加引用,则要对项目添加引用
来源:https://blog.csdn.net/qq_42855293/article/details/81981308


猜你喜欢
- springboot启动失败的问题springboot版本是1.3.0.M1,连接的mysql版本为8,用spring-boot-start
- Java语言是简单的:Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java丢弃了C++中很少使
- java Class.getSimpleName() 的用法Usage in android:private static final St
- 今天在云和学院学了很多,我这次只能先总结一下C#中的虚方法和抽象的运用。理论:虚方法:用virtual修饰的方法叫
- Java读取txt文件内容。可以作如下理解:首先获得一个文件句柄。File file = new File(); file即为文件句柄。两人
- Eclipse项目中为什么会有红感叹号,具体分析一下【问题原因】:工程中classpath中指向的包路径错误【解决办法】:右键项目名称 Bu
- Java中Collections.sort()的使用在日常开发中,很多时候都需要对一些数据进行排序的操作。然而那些数据一般都是放在一个集合中
- 很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,
- 背景近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令(例如比较并发交换指令)代替锁来确保数据在并发访问中的
- springboot环境切换失效概述最近在使用-Dspring.profiles.active=te 来切换spring-boot的环境时,
- 目录引言API介绍1、Optional(),empty(),of(),ofNullable()2、orElse(),orElseGet()和
- 本文实例讲述了C#及WPF获取本机所有字体和颜色的方法。分享给大家供大家参考。具体如下:WPF 获取所有的字体:System.Drawing
- 前言继上次文章C# 初识Picture控件,今天我们来学一下PictureBox的方法以及一些基本操作,对于图片的删除,上传以及重命名,之前
- 1、这个方法在GpsNET.JT809Core里来源:https://www.cnblogs.com/cnsend/p/12197982.h
- 目录1.前言2.不同进制的特点3.进制之间的转换3.1 二进制转十进制:3.2 十进制转二进制:3.3 二进制转八进制:3.4 十六进制转二
- class文件中的特殊字符串首先说明一下, 所谓的特殊字符串出现在class文件中的常量池中,本着循序渐进和减少跨度的原则, 首先把clas
- Android CheckBox中设置padding无效解决办法CheckBox使用本地图片资源CheckBox是Android中用的比较多
- 最近写了一个简单的聊天室应用,可以发送表情,更改头像这些功能。主要技术点就是怎样把表情图片放到textview等Ui控件中展示。这里废话不多
- 本文实例讲述了C# Socket网络编程技巧。分享给大家供大家参考。具体分析如下:客户端要连接服务器:首先要知道服务器的IP地址。而服务器里
- 经典的排序算法有八种,分别为:冒泡排序选择排序插入排序归并排序希尔排序快速排序堆排序基数排序其中冒泡排序、选择排序、插入排序称为三大基本排序