Unity C#图片转换二进制流、精灵与Png、jpg互转

48 篇文章 6 订阅

Chinar blog www.chinar.xin

图片转二进制流转换图片互转


本文提供全流程,中文翻译。

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

使有限时间 具备无限可能

Chinar —— 心分享、心创新!

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

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



全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

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();                                                                           //刷新文件夹
    }

2

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);
        }
    }
}

3

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();
        }
    }
}

4

Project —— 项目文件



项目文件为 unitypackage 文件包:

下载导入 Unity 即可使用
举个例子


支持

May Be —— 开发者,总有一天要做的事!


拥有自己的服务器,无需再找攻略

Chinar 提供一站式《零》基础教程

使有限时间 具备无限可能!

Chinar 知你所想,予你所求!( Chinar Blog )


Chinar

END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值