Unity C# 加载本地图片jpg/png/bmp texture转换为sprite

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香香家的臭臭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值