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);
}
// JPEG
if (buffer[0] == 0xFF && buffer[1] == 0xD8 && buffer[2] == 0xFF)
{
return EImageType.EitJPG;
}
// PNG
if (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;
}
// GIF
if (buffer[0] == 0x47 && buffer[1] == 0x49 && buffer[2] == 0x46 && buffer[3] == 0x38 && (buffer[4] == 0x37 || buffer[4] == 0x39) && buffer[5] == 0x61)
{
return EImageType.EitGif;
}
// BMP
if (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); // 垂直翻转修改这里
}
}
// 垂直翻转 Texture2D
var 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 转换为 sprite
foreach (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 转换为 sprite
foreach (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); // 垂直翻转修改这里
}
}
// 垂直翻转 Texture2D
var 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);
}
// JPEG
if (buffer[0] == 0xFF && buffer[1] == 0xD8 && buffer[2] == 0xFF)
{
return EImageType.EitJPG;
}
// PNG
if (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;
}
// GIF
if (buffer[0] == 0x47 && buffer[1] == 0x49 && buffer[2] == 0x46 && buffer[3] == 0x38 && (buffer[4] == 0x37 || buffer[4] == 0x39) && buffer[5] == 0x61)
{
return EImageType.EitGif;
}
// BMP
if (buffer[0] == 0x42 && buffer[1] == 0x4D)
{
return EImageType.EitBmp;
}
return EImageType.EitNk;
}
}