提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
方便快速的对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);
}
}
}