You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity Android平台Bitmap实现求助:替代System.Drawing方案

Unity Android平台替代System.Drawing.Bitmap的解决方案

Unity不支持System.Drawing命名空间,面向Android平台时,推荐用Unity自带的Texture2D类替代Bitmap,它完全适配跨平台需求,能覆盖Bitmap的绝大多数常用操作:

1. 加载图片(替代Bitmap加载)

从本地文件加载图片时,优先使用Unity的Application.persistentDataPath路径(Android可读写目录,无需额外权限),通过字节流加载为Texture2D:

using System.IO;
using UnityEngine;

public void LoadImage()
{
    string imagePath = Path.Combine(Application.persistentDataPath, "test.png");
    if (File.Exists(imagePath))
    {
        byte[] imageBytes = File.ReadAllBytes(imagePath);
        Texture2D texture = new Texture2D(2, 2); // 初始尺寸不影响,LoadImage会自动适配
        texture.LoadImage(imageBytes);
        // 后续可将texture赋值给RawImage、Sprite等UI组件
    }
}

2. 像素读写操作(替代Bitmap.GetPixel/SetPixel)

Texture2D提供了和Bitmap类似的像素读写方法,修改后必须调用Apply()才能保存更改:

public void ModifyPixels(Texture2D texture)
{
    // 读取像素
    Color targetColor = texture.GetPixel(50, 50);
    // 修改像素
    texture.SetPixel(50, 50, Color.blue);
    // 应用修改
    texture.Apply();
}

3. 保存图片(替代Bitmap.Save)

将Texture2D编码为PNG/JPG字节后写入文件,同样推荐用Application.persistentDataPath:

public void SaveImage(Texture2D texture)
{
    byte[] saveData = texture.EncodeToPNG(); // 若要保存为JPG,用EncodeToJPG()
    string savePath = Path.Combine(Application.persistentDataPath, "saved_image.png");
    File.WriteAllBytes(savePath, saveData);
}

4. 与Android原生Bitmap交互(若需调用原生API)

如果需要和Android原生代码交互(比如传递Bitmap给原生方法),可以通过Unity的AndroidJavaClass将Texture2D转换为Android原生Bitmap:

public AndroidJavaObject ConvertToAndroidBitmap(Texture2D texture)
{
    byte[] textureBytes = texture.EncodeToPNG();
    AndroidJavaClass bitmapFactory = new AndroidJavaClass("android.graphics.BitmapFactory");
    AndroidJavaObject nativeBitmap = bitmapFactory.CallStatic<AndroidJavaObject>(
        "decodeByteArray", textureBytes, 0, textureBytes.Length
    );
    // 使用完记得释放对象避免内存泄漏
    // nativeBitmap.Dispose();
    return nativeBitmap;
}

注意事项

  • 大量像素操作建议放在协程或Unity Job System中执行,避免阻塞主线程导致卡顿。
  • Texture2D的尺寸尽量使用2的幂次,部分旧Android设备对非2幂次纹理性能支持较差。
  • 加载网络图片时,优先使用UnityWebRequest而非System.IO相关方法,适配性更好。

内容的提问来源于stack exchange,提问作者YGreater

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:18:43