如何在运行时使用 .bmp 文件并在 Unity 中创建纹理?

Posted

技术标签:

【中文标题】如何在运行时使用 .bmp 文件并在 Unity 中创建纹理?【英文标题】:How can I use a .bmp file and create a Texture in Unity at runtime? 【发布时间】:2018-08-22 22:26:17 【问题描述】:

我在一个 Unity 项目中工作,用户选择用于制作 Texture2D 并粘贴到模型的图像文件(.bmp 格式),我创建下一个代码,我可以很好地使用 @ 987654323@ 和 .jpg 文件,但是当我尝试加载 .bmp 时,我只得到一个(我假设)带有红色“?”的默认纹理符号,所以我认为是图像格式,如何在运行时使用.bmp 文件创建纹理?

这是我的代码:

public static Texture2D LoadTexture(string filePath)

    Texture2D tex = null;
    byte[] fileData;

    if (File.Exists(filePath))
    
        fileData = File.ReadAllBytes(filePath);
        tex = new Texture2D(2, 2);
        tex.LoadImage(fileData);
    

    return tex;

【问题讨论】:

【参考方案1】:

Texture2D.LoadImage 函数仅用于将 PNG/JPG 图像字节数组加载到 Texture 中。它不支持.bmp,因此通常表示图像损坏或未知的红色符号是预期的。

要在 Unity 中加载 .bmp 图像格式,您必须阅读并理解 .bmp 格式规范,然后实现将其字节数组转换为 Unity 纹理的方法。幸运的是,这已经由另一个人完成了。获取 BMPLoader 插件here

要使用它,请包含 using B83.Image.BMP 命名空间:

public static Texture2D LoadTexture(string filePath)

    Texture2D tex = null;
    byte[] fileData;

    if (File.Exists(filePath))
    
        fileData = File.ReadAllBytes(filePath);

        BMPLoader bmpLoader = new BMPLoader();
        //bmpLoader.ForceAlphaReadWhenPossible = true; //Uncomment to read alpha too

        //Load the BMP data
        BMPImage bmpImg = bmpLoader.LoadBMP(fileData);

        //Convert the Color32 array into a Texture2D
        tex = bmpImg.ToTexture2D();
    
    return tex;

也可以跳过File.ReadAllBytes(filePath);部分,直接将.bmp图片路径传递给BMPLoader.LoadBMP函数:

public static Texture2D LoadTexture(string filePath)

    Texture2D tex = null;

    if (File.Exists(filePath))
    
        BMPLoader bmpLoader = new BMPLoader();
        //bmpLoader.ForceAlphaReadWhenPossible = true; //Uncomment to read alpha too

        //Load the BMP data
        BMPImage bmpImg = bmpLoader.LoadBMP(filePath);

        //Convert the Color32 array into a Texture2D
        tex = bmpImg.ToTexture2D();
    
    return tex;

【讨论】:

请注意,BMPLoader 不会检查镜像 bmps。这将导致它们被错误地绘制。 @AnthonyBurg:由于github 上提交的问题,我最近修复了加载程序的一些问题。我已经更新了两个版本。当高度为负时,它现在会翻转纹理。虽然这是一个非常罕见的情况。几乎没有图像编辑器使用这种格式。我仍然没有足够的时间向加载程序投掷足够的测试图像。如果您发现一些奇怪的东西,请随时提交问题。

以上是关于如何在运行时使用 .bmp 文件并在 Unity 中创建纹理?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Unity 运行时加载 FBX 文件?

BMP文件的编码方式?

BMP文件中奇怪的十六进制数字

在 C++ 中读取 .bmp 文件

如何在Android中压缩下载的图像并在需要时解压缩?

C++如何把位图保存到数组中