Unity Texture工具

本文介绍了在Unity中实现的Texture转换工具类TextureTools,包括TextureToSprite、Texture2DToSprite、TextureToTexture2D等方法,以及SaveTextureToPNG和Unity区域截图功能,帮助开发者更便捷地处理纹理资源。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

方便快速的对Texture各种转换。内容有限,后续继续添加。


提示:以下是本篇文章正文内容,下面案例可供参考

一、代码部分

/***********************
	创建者:		SZL
	内容描述:    *** 
************************/

using System;
using System.Collections;
using UnityEngine;

namespace SZL
{
    /// <summary>
    /// 图片
    /// </summary>
    public class TextureTools 
    {
        /*
        * ScreenCapture.CaptureScreenshot
        */


        /// <summary>
        /// Texture To Sprite
        /// </summary>
        /// <param name="texture"></param>
        /// <returns></returns>
        public static Sprite TextureToSprite(Texture texture)
        {
            Texture2D txt2D = TextureToTexture2D(texture);

            Sprite sp = Sprite.Create(txt2D, new Rect(0, 0, txt2D.width, txt2D.height), new Vector2(0.5f,0.5f));

            return sp;
        }
        /// <summary>
        /// Texture2D To Sprite
        /// </summary>
        /// <param name="txt2D"></param>
        /// <returns></returns>
        public static Sprite Texture2DToSprite(Texture2D txt2D)
        {
            Sprite sp = Sprite.Create(txt2D, new Rect(0, 0, txt2D.width, txt2D.height), new Vector2(0.5f, 0.5f));
            return sp;
        }

        /// <summary>
        ///  Texture To Texture2D
        /// </summary>
        /// <param name="texture"></param>
        /// <returns></returns>
        public static Texture2D TextureToTexture2D(Texture texture)
        {
            if (texture == null) return null;

            //new 一个新的
            Texture2D texture2D = new Texture2D(texture.width, texture.height, TextureFormat.RGBA32, false);

            //获取当前活跃的 RenderTexture
            RenderTexture currentRT = RenderTexture.active;

            //分配一个临时渲染纹理。 不要使用new ,使用 RenderTexture.GetTemporary  创建。可减少内存使用
            RenderTexture renderTexture = RenderTexture.GetTemporary(texture.width, texture.height, 32);

            // 将 texture的纹理 绘制到 renderTexture的纹理中
            Graphics.Blit(texture, renderTexture);

            //赋值给当前活跃的 RenderTexture
            RenderTexture.active = renderTexture;

            //读取像素信息并存储为纹理数据
            texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
            texture2D.Apply();

            //还原默认的 RenderTexture
            RenderTexture.active = currentRT;

            //释放
            RenderTexture.ReleaseTemporary(renderTexture);

            return texture2D;
        }

        /// <summary>
        /// Save Texture To PNG
        /// </summary>
        /// <param name="texture"></param>
        /// <param name="saveName">PNG 文件路径(路径+后缀名)</param>
        /// <returns></returns>
        public static IEnumerator SaveTextureToPng(Texture texture,string saveName)
        {
            if(System.IO.File.Exists(saveName))
            {
                Debug.LogError(saveName + "--- name is exist~~~");
                yield break;
            }

            if(!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(saveName)))
            {
                Debug.LogError(saveName + "--- Directory is not exist~~~");
            }

            //获取临时 RenderTexture
            RenderTexture temp = RenderTexture.GetTemporary(texture.width, texture.height, 0, RenderTextureFormat.ARGB32);

            //绘制纹理
            Graphics.Blit(texture, temp);

            //
            yield return SaveRenderTextureToPNG(temp, saveName);

            //释放 RenderTexture
            RenderTexture.ReleaseTemporary(temp);
        }

        /// <summary>
        /// Save RenderTexture To PNG
        /// </summary>
        /// <param name="rt"></param>
        /// <param name="saveName">PNG 文件路径(路径+后缀名)</param>
        /// <returns></returns>
        public static IEnumerator SaveRenderTextureToPNG(RenderTexture rt,string saveName)
        {
            yield return new WaitForEndOfFrame();

            //旧的 RenderTexture
            RenderTexture old = RenderTexture.active;

            //赋值 新的 
            RenderTexture.active = rt;

            int width = rt.width / 2, height = rt.height / 2;

            //创建一张Texture2d 
            Texture2D png = new Texture2D(width, height, TextureFormat.ARGB32, false);

            //读取屏幕像素信息并存储为纹理数据
            png.ReadPixels(new Rect(0, 0, width, height), 0, 0);
            png.Apply();

            //检测是否写入后缀名
            string ex = System.IO.Path.GetExtension(saveName);
            if (string.IsNullOrEmpty(ex))
                saveName += ".png";

            //获取字节
            byte[] bts = png.EncodeToPNG();

            //文件写入字节
            System.IO.File.WriteAllBytes(saveName, bts);

            //删除png
            Texture2D.DestroyImmediate(png);

            //还原
            RenderTexture.active = old;
        }

        /// <summary>
        /// Unity选取区域截图
        /// </summary>
        /// <param name="startPosition">开始位置</param>
        /// <param name="sizeData">区域大小</param>
        /// <param name="path">路径</param>
        /// <param name="completedAction"></param>
        /// <returns></returns>
        public static IEnumerator SaveAreaTextureToPNG(Vector2 startPosition,Vector2 sizeData, bool isWrite,string path,Action<Texture2D> tx2DAction = null)
        {
            yield return new WaitForEndOfFrame();

            //创建图片大小
            var tex = GetTexture2D(startPosition, sizeData);
            tx2DAction?.Invoke(tex);

            if(isWrite)
                WritePath(path, tex);
        }


        /// <summary>
        /// 获取texture2D
        /// </summary>
        /// <param name="startPosition"></param>
        /// <param name="sizeData"></param>
        /// <returns></returns>
        public static Texture2D GetTexture2D(Vector2 startPosition, Vector2 sizeData)
        {
            //创建图片大小
            Texture2D tex = new Texture2D((int)sizeData.x, (int)sizeData.y, TextureFormat.RGB24, false);

            //选取区域 并存储为纹理数据
            tex.ReadPixels(new Rect(startPosition.x, startPosition.y, (int)sizeData.x, (int)sizeData.y), 0, 0);
            tex.Apply();

            return tex;
        }

        /// <summary>
        /// 写入路径
        /// </summary>
        /// <param name="path"></param>
        /// <param name="tex"></param>
        public static void WritePath(string path, Texture2D tex)
        {
            //检测是否写入后缀名
            string ex = System.IO.Path.GetExtension(path);
            if (string.IsNullOrEmpty(ex))
                path += ".png";

            //读取texture转png字节
            byte[] bytes = tex.EncodeToPNG();

            //写入字节
            System.IO.File.WriteAllBytes(path, bytes);

            //删除png
            Texture2D.DestroyImmediate(tex);
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值