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
相关产品推荐
相关产品推荐

