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中报错没有添加引用,则要对项目添加引用

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值