Unity动态加载本地图片

news/2024/12/2 14:39:35/

Unity运行时动态加载本地图片

一、Unity运行时加载本地文件夹下所有图片的方法,用于在使用图片前加载完成

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// IO加载本地图片 txt文档
/// </summary>
public class ComPanyUILoadController : MonoBehaviour {public static ComPanyUILoadController instance { get; private set; }private string jsonPath = @"E:\文件夹名\json存放文件夹\json名.json"; //json文件路径private string imagePath = @"E:\文件夹名\文件夹名\"; //图片文件路径public List<CompanyData> datas;  //数据存储列表public CompanyData currentDatas; //Json解析格式 private void Awake(){instance = this;//加载各个文件datas = JsonToObject.JsonToObject_ByJsonFile<CompanyData>(jsonPath); //json解析}#region  图片加载/// <summary>/// 获取文件根路径/// </summary>/// <returns></returns>private string GetPath(){string path ="";foreach (CompanyData i in datas){if (GameManager.instacne.currentCompany.Equals(i.ID))  //加载编号{path = imagePath + i.Name+@"\";}}return path;  // E:\文件夹名\文件夹名\文件夹名\}/// <summary>/// 按照表编号加载对象/// </summary>/// <returns></returns>public CompanyData LoadText(){foreach (var i in datas){if (i.ID == null){break;}if (i.ID.Equals(GameManager.instacne.currentCompany)){currentDatas = i;}}return currentDatas;}/// <summary>///加载一个文件夹中所有的图片流 返回字典/// 加载图片的Dictionary<string,List<Byte[]>>/// </summary>/// <param name="filesName">图片所在文件夹地址</param>/// <returns></returns>public Dictionary<string, List<byte[]>> LoadImages(string filesName){Dictionary<string, List<byte[]>> list = new Dictionary<string, List<byte[]>>();string tempPath = GetPath() + filesName; //图片文件夹位置List<string> filePaths = new List<string>();string imgtype = "*.BMP|*.JPG|*.PNG";string[] ImageType = imgtype.Split('|');for (int i = 0; i < ImageType.Length; i++){//文件夹下所有的图片路径  string[] dirs = Directory.GetFiles(tempPath, ImageType[i]);for (int j = 0; j < dirs.Length; j++){filePaths.Add(dirs[j]);}}for (int i = 0; i < filePaths.Count; i++){//切割图片名和对对应的图片流数据List<byte[]> tl = new List<byte[]>();string Tstr = filePaths[i].Split('\\')[5].Split('.')[0]; //图片位置 下标为5个元素是图片名称  分割图片名称byte[] bs = getImageByte(filePaths[i]);tl.Add(bs);list.Add(Tstr,tl); //图片名和图片流数据对应}return list;}#region 加载图片List<Texture2D>/// <summary>///加载文件夹下所有图片流 返回图片流列表/// 加载图片的Byte[]数组/// </summary>/// <param name="filesName">地址</param>public List<byte[]> LoadImage(string filesName){List<byte[]> list = new List<byte[]>();string tempPath = GetPath() + filesName;  //图片文件夹路径List<string> filePaths = new List<string>();string imgtype = "*.BMP|*.JPG|*.PNG";string[] ImageType = imgtype.Split('|');for (int i = 0; i < ImageType.Length; i++){//文件夹下所有的图片路径  string[] dirs = Directory.GetFiles(tempPath, ImageType[i]);for (int j = 0; j < dirs.Length; j++){filePaths.Add(dirs[j]);}}//通过路径加载图片流for (int i = 0; i < filePaths.Count; i++){byte[] bs = getImageByte(filePaths[i]);list.Add(bs);}return list;}#endregion/// <summary>  /// 根据图片路径返回图片的字节流byte[]  /// </summary>  /// <param name="imagePath">图片路径</param>  /// <returns>返回的字节流</returns>  private byte[] getImageByte(string imagePath){FileStream files = new FileStream(imagePath, FileMode.Open,FileAccess.Read);files.Seek(0,SeekOrigin.Begin);byte[] imgByte = new byte[files.Length];files.BeginRead(imgByte,0,(int)files.Length,CallBack,files);return imgByte;}/// <summary>/// 异步加载/// </summary>/// <param name="ar"></param>void CallBack(IAsyncResult ar){FileStream fs = ar.AsyncState as FileStream;fs.Close();fs.Dispose();}#endregion
}

用的时候:

List<byte[]> data=new  List<byte[]>();  //临时接收图片数据流
List<Texture2D> turList=new List<Texture2D>();  //保存图片
data=ComPanyUILoadController.instance.LoadImage("图片所在文件夹");
foreach (byte[] item in data)
{//文件byte[]转换成Texture2DTexture2D tex = new Texture2D(100, 100, TextureFormat.RGBA32, false);   tex.LoadImage(item); //建议哪里调用哪里转turList.Add(tex);  
}//后续或将Texture2D转换为Sprite使用

二、Unity运行时临时加载本地文件夹下一张图片的方法

    public static class ImageLoad {public static Texture2D LoadImageByte(string path){//读取图片位置   PathSet.dataPath+path=图片所在文件夹路径\+图片名称.格式        .png/.jpg等FileStream files=new FileStream (PathSet.dataPath+path,FileMode.Open,FileAccess.Read);files.Seek(0,SeekOrigin.Begin);byte[] imgByte=new byte[files.Length];//这种加载方法临时加载可能会加载数据流不全,在转成Texture2D出现红问号加载失败的情况//files.BeginRead(imgByte,0,(int)files.Length,CallBack,files);files.Read(imgByte,0,imgByte.Length);files.Close();Texture2D tx=new Texture2D (512,512);tx.LoadImage(imgByte);return tx;}//分线程加载static void CallBack(IAsyncResult ar){FileStream fileStream=ar.AsyncState as FileStream;fileStream.Close();fileStream.Dispose();} }

http://www.ppmy.cn/news/247858.html

相关文章

动态修改svg图片颜色

使用场景 引入颜色为纯色的svg图片时&#xff0c;动态修改svg图片填充颜色。引入的方式包括直接svg代码引用和img标签间接引用。 直接引用SVG 如果通过svg代码的方式引入图片&#xff0c;那么可以直接修改fill属性动态修改颜色。代码如下 <style>svg:hover{fill: #fa0…

一、tienchin健身系统技术点复现-注解限流

一、tienchin健身系统技术点复现-注解限流 这个技术用到的点是 用Java代码执行 redis 的 lua 脚本&#xff0c;采用 请求接口方法 注解RateLimiter &#xff0c;前置通知拦截判断请求次数&#xff0c;做出限流操作。 Gitee代码仓库-rate-limiter 1、application.yml 配置 re…

如何选择正确的图片格式? 图片格式详细科普

数字图片处理是指通过离线或在线资源&#xff08;如编辑软件和网络应用程序&#xff09;来处理图片。其转换过程旨在提高图片质量或从图片中提取更多信息。小编将详细介绍常见的图片格式以及如何进行图片格式转换方便查看&#xff0c;刚好对此有困惑的小伙伴可以一块来看一看。…

HEIF图片存储格式探秘

HEIF&#xff0c;High Efficiency Image File Format&#xff0c;即高效率图档格式&#xff0c;是由动态图像专家组&#xff08;MPEG–Moving Picture Experts Group &#xff09;在2013年推出的存储图片和图片序列的新格式&#xff0c;用于HEVC关键帧的处理上&#xff0c;因此…

Unity 如何实现批量修改图片格式

前言 unity开发游戏过程中&#xff0c;经常会批量修改部分图片格式&#xff0c;比如ios端&#xff0c;我们会修改为astc6x6&#xff0c;android端我们会修改为ETC2。又或者我们需要把图片打包图集&#xff0c;需要批量设置SpriteTag。但是当我们导入大量图片时&#xff0c;如果…

前端常见图片格式整理

前端常见图片格式整理 PNG &#xff08;Portable Network Graphics&#xff0c;便携式网络图形&#xff0c;1996&#xff09; PNG有8位、24位、32位三种形式&#xff0c;其中8位PNG支持两种不同的透明形式&#xff08;索引透明和alpha透明&#xff09;&#xff0c;24位PNG不支…

动态图片生成方案

关注公众号 前端开发博客&#xff0c;领27本电子书 回复加群&#xff0c;自助秒进前端群 作者:阅文前端团队 原文:https://mp.weixin.qq.com/s/0dWfL3ChIceH6rQ8-Oh6pg 一、背景 在业务需求中&#xff0c;根据返回数据动态生成图片分享是很常见的场景。比如在起点读书小程序中&…

图片格式-AVIF

一、前言 打开caniuse首页&#xff08;https://caniuse.com/)&#xff0c;在最新的特性这里看到一个陌生的东西&#xff0c;一个名为AVIF的图片格式&#xff0c;这么名词有意思&#xff0c;AV&#xff1f;IF&#xff1f;等下&#xff0c;我先系个安全带&#xff0c;可以了&…