Demo

Unity C#图片精灵与Png、jpg互转

chinar · 1月31日 · 2019年 662次已读


Chinar —— 心分享、心创新!

我们的初衷是将一种简单的生活方式,带给世人

使有限时间 具备无限可能

Chinar —— 心分享、心创新!

助力学习 Unity 中对图片多种处理、用法

为新手节省宝贵的时间,避免采坑!

1 Png To Sprite —— Png 转 Sprite

将 PNG 图片转精灵 Sprite 图片

使用场景:将外部Png图片,显示在软件中。设置个头像、设置背景之类的自定义设置功能

using System.IO;
using UnityEngine;
using UnityEngine.UI;


public class ChinarSpriteToPng : MonoBehaviour
{
    /// <summary>
    /// 按钮点击事件:精灵转PNG图片
    /// </summary>
    public void OnClick_PngToSprite()
    {
        //找到场景中的 图片组件,并赋值
        GameObject.Find("PNG To Sprite/Sprite").GetComponent<Image>().sprite = PngToSprite(Application.streamingAssetsPath + "/PngToSprite/Chinar1.jpg", 300, 300);
    }


    /// <summary>
    /// IO方式 —— 将PNG转为Sprite精灵图片
    /// </summary>
    /// <param name="fullPath">读取的PNG图片全路径:路径+文件名+后缀</param>
    /// <param name="x">图片尺寸:宽</param>
    /// <param name="y">图片尺寸:高</param>
    /// <returns></returns>
    private Sprite PngToSprite(string fullPath, int x, int y)
    {
        using (FileStream fs = new FileStream(fullPath, FileMode.Open, FileAccess.Read)) //自动双清
        {
            fs.Seek(0, SeekOrigin.Begin);            //设定当前流的位置
            byte[] bytes = new byte[fs.Length];      //创建文件长度缓冲区
            fs.Read(bytes, 0, (int) fs.Length);      //读取文件
            Texture2D texture = new Texture2D(x, y); //创建Texture
            texture.LoadImage(bytes);
            return Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.one / 2);
        }
    }
}

2 Sprite To Png —— Sprite 转 Png

将 Unity 中的精灵图片 Sprite 转为 Png 并 IO 保存下来

使用场景:将软件中的图片保存,将指定的UI 精灵图保存到本地

// ========================================================
// 描述:精灵与PNG图片相互转换
// 作者:Chinar 
// 创建时间:2019-01-30 11:15:47
// 版 本:1.0
// ========================================================
using System.IO;
using UnityEngine;


public class ChinarSpriteToPng : MonoBehaviour
{
    /// <summary>
    /// 精灵转PNG图片
    /// </summary>
    public void OnClick_SpriteToPng()
    {
        Sprite     sprite = Resources.Load<Sprite>("WeChat1");                                                             //读取 资源目录中的 WeChat1文件//动态加载 Sprite
        byte[]     bt     = sprite.texture.EncodeToPNG();                                                                  //将Texture转字节流
        FileStream fs     = new FileStream(Application.streamingAssetsPath + "/SpriteToPng/WeChat1.png", FileMode.Create); //创建PNG文件
        using (fs)
        {
            fs.Write(bt, 0, bt.Length); //写入
            fs.Flush();
        }
    }
}

3 Load Picture To Create —— 加载图片并创建

函数已经简化并封装、调用时将图片路径传入,以及导出路径

整个流程就是:将传入路径的图片,转为流,然后生成到另一个指定目录中

/// <summary>
    /// 解析图片,此函数仅为提供可视化测试。
    /// (打开项目,选中一个图片。就能将选中的图片写到资源目录下)
    /// </summary>
    /// <param name="path">图片的路径</param>
    /// <param name="targetPath">目标全路径:路径+文件名+后缀</param>
    private void AnalysisImage(string path,string targetPath)
    {
        FileStream   fs          = new FileStream(path, FileMode.Open);                                    // 使用文件流构造一个二进制读取器,元数据转为二进制值
        BinaryReader br          = new BinaryReader(fs);                                                   //二进制读取类
        byte[]       imageBuffer = new byte[br.BaseStream.Length];                                         //转为字节流
        br.Read(imageBuffer, 0, Convert.ToInt32(br.BaseStream.Length));                                    //读所有信息
        string textString = System.Convert.ToBase64String(imageBuffer);                                    //转为字符串(未使用,你可以写个Json存下来试试)
        fs.Close();                                                                                        //关
        br.Close();                                                                                        //双关
        System.IO.File.WriteAllBytes(targetPath, imageBuffer); //将图片写到Assets目录下,名叫Chinar+index.jpg | imageBuffer:二进制流
        AssetDatabase.Refresh();                                                                           //刷新文件夹
    }

4 Project —— 项目文件

Chinar Demo

Chinar 精心准备的 Demo, 以便于您测试与理解

项目文件为 unitypackage 文件包,下载导入 Unity 即可测试使用

Title

Description

Title

Description

Title

Description


END

欢迎分享、点赞、转载、和链接博客站点或文章,使用时请务必注明文章或内容出处并注明网址。
其它事宜,请与本博主进行联系,留言,Email: ichinar@icloud.com
本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究!

0 条回应