unity在加载本地图片的时候需要先判断图片类型
internal enum EImageType
{EitNk,EitJPG,EitPNG,EitBmp,EitGif
}
private static EImageType GetImageType(string filePath){if (!File.Exists(filePath)){Debug.Log("Cannot find " + filePath);return EImageType.EitNk;}var buffer = new byte[8];using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)){var read = fs.Read(buffer, 0, 8);Debug.Log(read);}// JPEGif (buffer[0] == 0xFF && buffer[1] == 0xD8 && buffer[2] == 0xFF){return EImageType.EitJPG;}// PNGif (buffer[0] == 0x89 && buffer[1] == 0x50 && buffer[2] == 0x4E && buffer[3] == 0x47 && buffer[4] == 0x0D && buffer[5] == 0x0A && buffer[6] == 0x1A && buffer[7] == 0x0A){return EImageType.EitPNG;}// GIFif (buffer[0] == 0x47 && buffer[1] == 0x49 && buffer[2] == 0x46 && buffer[3] == 0x38 && (buffer[4] == 0x37 || buffer[4] == 0x39) && buffer[5] == 0x61){return EImageType.EitGif;}// BMPif (buffer[0] == 0x42 && buffer[1] == 0x4D){return EImageType.EitBmp;}return EImageType.EitNk;}
加载jpg或者png图片
private static Texture2D LoadTextureFromJpgOrPng(string inFilePath){Debug.Log("Load Texture From Jpg Or Png");var imageData = File.ReadAllBytes(inFilePath);var texture = new Texture2D(8, 8);texture.LoadImage(imageData);return texture;}
加载bmp图片
private static Texture2D LoadTextureFromBmp(string inFilePath){Debug.Log("Load Texture From Bmp");var imageData = File.ReadAllBytes(inFilePath);int dataOffset = imageData[10];var width = imageData[18] + (imageData[19] << 8);var height = imageData[22] + (imageData[23] << 8);int bpp = imageData[28];var texture = new Texture2D(width, height);var stride = width * bpp / 8;var padding = stride % 4;if (padding != 0)stride += 4 - padding;var colors = new Color32[width * height];for (var y = 0; y < height; y++){for (var x = 0; x < width; x++){var index = dataOffset + y * stride + x * bpp / 8; // 垂直翻转修改这里var b = imageData[index];var g = imageData[index + 1];var r = imageData[index + 2];colors[(height - y - 1) * width + x] = new Color32(r, g, b, 255); // 垂直翻转修改这里}}// 垂直翻转 Texture2Dvar flippedColors = new Color32[width * height];for (var y = 0; y < height; y++){for (var x = 0; x < width; x++){flippedColors[(height - y - 1) * width + x] = colors[y * width + x];}}texture.SetPixels32(flippedColors);texture.Apply();return texture;}
根据本地地址,加载图片,如果有需要的话,可以将texture转换为sprite
private void LoadingImage(string inPath){if (!Directory.Exists(inPath)){Debug.Log(inPath + " 该文件夹不存在");return;}const string imgType = "*.png|*.jpg|*.bmp";var imgTypes = imgType.Split('|');var imgPaths = imgTypes.SelectMany(type => Directory.GetFiles(inPath, type)).ToList();foreach (var i in imgPaths){var type = GetImageType(i);switch (type){case EImageType.EitNk:break;case EImageType.EitJPG:case EImageType.EitPNG:texture2Ds.Add(LoadTextureFromJpgOrPng(i));break;case EImageType.EitBmp:texture2Ds.Add(LoadTextureFromBmp(i));break;case EImageType.EitGif:break;default:throw new ArgumentOutOfRangeException();}}// texture 转换为 spriteforeach (var sprite in texture2Ds.Select(tex => Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero))){imgSprites.Add(sprite);}}
最后把所有的函数方法整合在一起,完整版就是这样的
using System;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Linq;internal enum EImageType
{EitNk,EitJPG,EitPNG,EitBmp,EitGif
}public class LoadImage : MonoBehaviour
{private string _filePath;public List<Sprite> imgSprites = new List<Sprite>();public List<Texture2D> texture2Ds = new List<Texture2D>();private void Start(){_filePath = Application.dataPath + "/../Pictures";LoadingImage(_filePath);}private void LoadingImage(string inPath){if (!Directory.Exists(inPath)){Debug.Log(inPath + " 该文件夹不存在");return;}const string imgType = "*.png|*.jpg|*.bmp";var imgTypes = imgType.Split('|');var imgPaths = imgTypes.SelectMany(type => Directory.GetFiles(inPath, type)).ToList();foreach (var i in imgPaths){var type = GetImageType(i);switch (type){case EImageType.EitNk:break;case EImageType.EitJPG:case EImageType.EitPNG:texture2Ds.Add(LoadTextureFromJpgOrPng(i));break;case EImageType.EitBmp:texture2Ds.Add(LoadTextureFromBmp(i));break;case EImageType.EitGif:break;default:throw new ArgumentOutOfRangeException();}}// texture 转换为 spriteforeach (var sprite in texture2Ds.Select(tex => Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero))){imgSprites.Add(sprite);}}private static Texture2D LoadTextureFromJpgOrPng(string inFilePath){Debug.Log("Load Texture From Jpg Or Png");var imageData = File.ReadAllBytes(inFilePath);var texture = new Texture2D(8, 8);texture.LoadImage(imageData);return texture;}private static Texture2D LoadTextureFromBmp(string inFilePath){Debug.Log("Load Texture From Bmp");var imageData = File.ReadAllBytes(inFilePath);int dataOffset = imageData[10];var width = imageData[18] + (imageData[19] << 8);var height = imageData[22] + (imageData[23] << 8);int bpp = imageData[28];var texture = new Texture2D(width, height);var stride = width * bpp / 8;var padding = stride % 4;if (padding != 0)stride += 4 - padding;var colors = new Color32[width * height];for (var y = 0; y < height; y++){for (var x = 0; x < width; x++){var index = dataOffset + y * stride + x * bpp / 8; // 垂直翻转修改这里var b = imageData[index];var g = imageData[index + 1];var r = imageData[index + 2];colors[(height - y - 1) * width + x] = new Color32(r, g, b, 255); // 垂直翻转修改这里}}// 垂直翻转 Texture2Dvar flippedColors = new Color32[width * height];for (var y = 0; y < height; y++){for (var x = 0; x < width; x++){flippedColors[(height - y - 1) * width + x] = colors[y * width + x];}}texture.SetPixels32(flippedColors);texture.Apply();return texture;}private static EImageType GetImageType(string filePath){if (!File.Exists(filePath)){Debug.Log("Cannot find " + filePath);return EImageType.EitNk;}var buffer = new byte[8];using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)){var read = fs.Read(buffer, 0, 8);Debug.Log(read);}// JPEGif (buffer[0] == 0xFF && buffer[1] == 0xD8 && buffer[2] == 0xFF){return EImageType.EitJPG;}// PNGif (buffer[0] == 0x89 && buffer[1] == 0x50 && buffer[2] == 0x4E && buffer[3] == 0x47 && buffer[4] == 0x0D && buffer[5] == 0x0A && buffer[6] == 0x1A && buffer[7] == 0x0A){return EImageType.EitPNG;}// GIFif (buffer[0] == 0x47 && buffer[1] == 0x49 && buffer[2] == 0x46 && buffer[3] == 0x38 && (buffer[4] == 0x37 || buffer[4] == 0x39) && buffer[5] == 0x61){return EImageType.EitGif;}// BMPif (buffer[0] == 0x42 && buffer[1] == 0x4D){return EImageType.EitBmp;}return EImageType.EitNk;}
}