使用只需要将单例方法更改一下就行,后续将持续进行更新,用到哪补充到哪
如在使用过程中有任何不适,请评论区插眼,谢谢
插眼 : 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()
{
}
}
}