Unity 我的 Texturekit 工具类

it2024-11-07  6

 

使用只需要将单例方法更改一下就行,后续将持续进行更新,用到哪补充到哪  

如在使用过程中有任何不适,请评论区插眼,谢谢

 

 

插眼 : 2020/10/31 更新

1. 返回 在指定目录下加载的所有图片的 Texture2D 

2. 文件 转 字节

3. 得到指定后缀格式的所有文件路径

4. 得到多个指定后缀格式的所有文件路径 

5. 文件夹目录最多只保留指定数量的图片

6. IO保存 Texture2D 到本地为 Png

7. 默认使用 携程来保存图片到路径 其他方式可能造成主线程一瞬间的卡顿 携程完成有回调

8. PNG 图片存储大小压缩

9. 图片尺寸大小缩放

using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.IO; using UnityEngine; namespace QFramework.Example { public class TextureKit : ISingleton { private TextureKit() { } public static TextureKit Instance { get { return SingletonProperty<TextureKit>.Instance; } } /// <summary> /// 返回 在指定目录下加载的所有图片的 Texture2D /// </summary> /// <returns></returns> public List<Texture2D> LoadTexture2DToList(string sFold) { List<Texture2D> lLoadT2ds = new List<Texture2D>(); //获取到路劲 List<string> filePaths = new List<string>(); filePaths = GetImagesPath(sFold); //新建时要给上大小,小于原先的图片大小会出现图片值截取一块的情况 //根据读取到的文件路径,一个文件一个文件的将图片存储进去 for (int i = 0; i < filePaths.Count; i++) { Image image = Image.FromStream(new MemoryStream(FileToBytes(filePaths[i]))); Texture2D t2d = new Texture2D(image.Width, image.Height); //根据路劲读取字节流再转换成图片形式 t2d.LoadImage(FileToBytes(filePaths[i])); //放到集合里面 lLoadT2ds.Add(t2d); } return lLoadT2ds; } /// <summary> /// 文件 转 字节 /// </summary> /// <param name="sFilePath"></param> /// <returns></returns> public static byte[] FileToBytes(string sFilePath) { //读取到文件 FileStream files = new FileStream(sFilePath, FileMode.Open); //新建比特流对象 byte[] bArrFileBytes = new byte[files.Length]; //将文件写入对应比特流对象 files.Read(bArrFileBytes, 0, bArrFileBytes.Length); //关闭文件 files.Close(); //返回比特流的值 return bArrFileBytes; } /// <summary> /// 得到指定后缀格式的所有文件路径 /// 默认后缀为 "*.PNG" /// </summary> /// <returns></returns> public List<string> GetImagesPath(string sFold, string sNameSuffix = "*.PNG") { List<string> filePaths = new List<string>(); //获取unity根目录下的图片文件夹下的所有文件的路径 路径+ 名称全部存储在字符串数组中 //string[] dirs = Directory.GetFiles(Application.streamingAssetsPath + "/BlendFaceImages", sNameSuffix); string[] dirs = Directory.GetFiles(sFold, sNameSuffix); for (int j = 0; j < dirs.Length; j++) { filePaths.Add(dirs[j]); //Debug.Log("图片路径为 " + dirs[j]); } Debug.Log("一共读取到" + dirs.Length + "张图片"); return filePaths; } /// <summary> /// 得到多个指定后缀格式的所有文件路径 /// Case : 需自己修改 imgtype按照格式去添加后缀格式 /// </summary> /// <returns></returns> public List<string> GetMultiNameSuffixFilePath(string sFold) { List<string> filePaths = new List<string>(); string imgtype = "*.JPG|*.PNG"; string[] ImageType = imgtype.Split('|'); for (int i = 0; i < ImageType.Length; i++) { //获取unity根目录下的图片文件夹下的所有文件的路径 路径+ 名称全部存储在字符串数组中 string[] dirs = Directory.GetFiles(sFold, ImageType[i]); for (int j = 0; j < dirs.Length; j++) { filePaths.Add(dirs[j]); Debug.Log("文件路径为 " + dirs[j]); } Debug.Log("一共读取到" + dirs.Length + "个文件"); } return filePaths; } /// <summary> /// 文件夹目录最多只保留指定数量的图片 /// sNameSuffix 后缀名 /// </summary> public void DeleteWhenOverLoad(string sFoldPath, string sNameSuffix = "", int iFoldMaxSaveNum = 40) { //获取unity根目录下的图片文件夹下的所有文件的路径 路径+ 名称全部存储在字符串数组中 //string[] dirs = Directory.GetFiles(Application.streamingAssetsPath + "/BlendFaceImages", "*.PNG"); string[] dirs = Directory.GetFiles(sFoldPath, "*.PNG"); Log.I("文件夹目录大小 : " + dirs.Length); //需要删除的数量 int iNeedDeleteNum = dirs.Length - iFoldMaxSaveNum; if (iNeedDeleteNum > 0) { for (int i = 0; i < iNeedDeleteNum; i++) { File.Delete(dirs[i]); Log.I("++++++++++++++ 文件被删除 +++++" + dirs[i]); } } } /// <summary> /// IO保存 Texture2D 到本地为 Png /// </summary> /// <param name="texture">传入要保存的 Texture2D</param> /// <param name="sFullPath">传入你要保存的位置 完整路径</param> public void SaveTexture2DToPNG(Texture2D texture, string sFullPath) { 第一种方式 //var bytes = texture.EncodeToPNG(); //var file = File.Open(sFullPath, FileMode.Create); //var binary = new BinaryWriter(file); //binary.Write(bytes); //file.Close(); // 第二种方式 EncodeToPNG这个会导致主线程卡顿 携程一样 System.IO.File.WriteAllBytes(sFullPath, texture.EncodeToPNG()); } /// <summary> /// 默认使用 携程来保存图片到路径 其他方式可能造成主线程一瞬间的卡顿 携程完成有回调 /// </summary> /// <param name="sBlendFaceImageName"></param> /// <param name="texture"></param> /// <param name="sFullPath"></param> /// <returns></returns> public IEnumerator SaveTexture2DToPNGCoroutine(string sBlendFaceImageName, Texture2D texture, string sFullPath, Action callback) { //yield return new WaitForSeconds(5f); yield return new WaitForEndOfFrame(); byte[] bytes = texture.EncodeToPNG(); //将纹理数据,转化成一个png图片 System.IO.File.WriteAllBytes(sFullPath, bytes); //写入文件之后触发 callback?.Invoke(); #region // 使用示例 // 携程保存图片 //StartCoroutine(TextureKit.Instance.SaveTexture2DToPNGCoroutine(sBlendFaceImageName, m_tBlendTexture as Texture2D, DataManager.Instance.sBlendFaceImagesFoldPath + sBlendFaceImageName, (() => //{ // //Debug.Log("妈妈再也不担心我存图片了"); // // 人脸融合完成,广播事件 // QEventSystem.SendEvent(FaceEvent.OnFaceMergeFinish, sBlendFaceImageName); //}))); #endregion } /// <summary> /// PNG 图片存储大小压缩 /// </summary> /// <param name="imagePath"></param> public void CompressPNG(string imagePath) { byte[] fileData = File.ReadAllBytes(imagePath); Texture2D tex = new Texture2D((int)(Screen.width), (int)(Screen.height), TextureFormat.RGB24, true); tex.LoadImage(fileData); float miniSize = Mathf.Max(tex.width, tex.height); float scale = 1200.0f / miniSize; if (scale > 1.0f) { scale = 1.0f; } Texture2D temp = ScaleTexture(tex, (int)(tex.width * scale), (int)(tex.height * scale)); byte[] pngData = temp.EncodeToPNG(); // string miniImagePath = imagePath.Replace(".png", "_min.jpg"); File.WriteAllBytes(imagePath, pngData); } /// <summary> /// 图片尺寸大小缩放 /// </summary> /// <param name="source"></param> /// <param name="targetWidth"></param> /// <param name="targetHeight"></param> /// <returns></returns> private Texture2D ScaleTexture(Texture2D source, int targetWidth, int targetHeight) { Texture2D result = new Texture2D(targetWidth, targetHeight, source.format, true); UnityEngine.Color[] rpixels = result.GetPixels(0); float incX = ((float)1 / source.width) * ((float)source.width / targetWidth); float incY = ((float)1 / source.height) * ((float)source.height / targetHeight); for (int px = 0; px < rpixels.Length; px++) { rpixels[px] = source.GetPixelBilinear(incX * ((float)px % targetWidth), incY * ((float)Mathf.Floor(px / targetWidth))); } result.SetPixels(rpixels, 0); result.Apply(); return result; } public void OnSingletonInit() { } } }

 

 插眼 : 2020/10/21 更新

1. 返回 在指定目录下加载的所有图片的 Texture2D 

2. 文件 转 字节

3. 得到指定后缀格式的所有文件路径

4. 得到多个指定后缀格式的所有文件路径 

5. 文件夹目录最多只保留指定数量的图片

using System.Collections.Generic; using System.IO; using UnityEngine; using System.Drawing; namespace QFramework.Example { public class TextureKit:ISingleton { private TextureKit() { } public static TextureKit Instance { get { return SingletonProperty<TextureKit>.Instance; } } /// <summary> /// 返回 在指定目录下加载的所有图片的 Texture2D /// </summary> /// <returns></returns> public List<Texture2D> LoadTexture2DToList(string sFold) { List<Texture2D> lLoadT2ds = new List<Texture2D>(); //获取到路劲 List<string> filePaths = new List<string>(); filePaths = GetImagesPath(sFold); //新建时要给上大小,小于原先的图片大小会出现图片值截取一块的情况 //根据读取到的文件路径,一个文件一个文件的将图片存储进去 for (int i = 0; i < filePaths.Count; i++) { Image image = Image.FromStream(new MemoryStream(FileToBytes(filePaths[i]))); Texture2D t2d = new Texture2D(image.Width, image.Height); //根据路劲读取字节流再转换成图片形式 t2d.LoadImage(FileToBytes(filePaths[i])); //放到集合里面 lLoadT2ds.Add(t2d); } return lLoadT2ds; } /// <summary> /// 文件 转 字节 /// </summary> /// <param name="sFilePath"></param> /// <returns></returns> public static byte[] FileToBytes(string sFilePath) { //读取到文件 FileStream files = new FileStream(sFilePath, FileMode.Open); //新建比特流对象 byte[] bArrFileBytes = new byte[files.Length]; //将文件写入对应比特流对象 files.Read(bArrFileBytes, 0, bArrFileBytes.Length); //关闭文件 files.Close(); //返回比特流的值 return bArrFileBytes; } /// <summary> /// 得到指定后缀格式的所有文件路径 /// 默认后缀为 "*.PNG" /// </summary> /// <returns></returns> public List<string> GetImagesPath(string sFold, string sNameSuffix = "*.PNG") { List<string> filePaths = new List<string>(); //获取unity根目录下的图片文件夹下的所有文件的路径 路径+ 名称全部存储在字符串数组中 //string[] dirs = Directory.GetFiles(Application.streamingAssetsPath + "/BlendFaceImages", sNameSuffix); string[] dirs = Directory.GetFiles(sFold, sNameSuffix); for (int j = 0; j < dirs.Length; j++) { filePaths.Add(dirs[j]); //Debug.Log("图片路径为 " + dirs[j]); } Debug.Log("一共读取到" + dirs.Length + "张图片"); return filePaths; } /// <summary> /// 得到多个指定后缀格式的所有文件路径 /// Case : 需自己修改 imgtype按照格式去添加后缀格式 /// </summary> /// <returns></returns> public List<string> GetMultiNameSuffixFilePath(string sFold) { List<string> filePaths = new List<string>(); string imgtype = "*.JPG|*.PNG"; string[] ImageType = imgtype.Split('|'); for (int i = 0; i < ImageType.Length; i++) { //获取unity根目录下的图片文件夹下的所有文件的路径 路径+ 名称全部存储在字符串数组中 string[] dirs = Directory.GetFiles(sFold, ImageType[i]); for (int j = 0; j < dirs.Length; j++) { filePaths.Add(dirs[j]); Debug.Log("文件路径为 " + dirs[j]); } Debug.Log("一共读取到" + dirs.Length + "个文件"); } return filePaths; } /// <summary> /// 文件夹目录最多只保留指定数量的图片 /// sNameSuffix 后缀名 /// </summary> public void DeleteWhenOverLoad(string sFoldPath, string sNameSuffix = "", int iFoldMaxSaveNum = 40) { //获取unity根目录下的图片文件夹下的所有文件的路径 路径+ 名称全部存储在字符串数组中 //string[] dirs = Directory.GetFiles(Application.streamingAssetsPath + "/BlendFaceImages", "*.PNG"); string[] dirs = Directory.GetFiles(sFoldPath, "*.PNG"); Log.I("文件夹目录大小 : " + dirs.Length); //需要删除的数量 int iNeedDeleteNum = dirs.Length - iFoldMaxSaveNum; if (iNeedDeleteNum > 0) { for (int i = 0; i < iNeedDeleteNum; i++) { File.Delete(dirs[i]); Log.I("++++++++++++++ 文件被删除 +++++" + dirs[i]); } } } public void OnSingletonInit() { } } }

 

最新回复(0)