安卓图像处理主要围绕位图(Bitmap)操作展开,核心目标是实现图像渲染、编辑、滤镜叠加、格式转换等功能,需重点关注内存管理(避免OOM)、渲染性能(减少卡顿)和跨设备兼容性。
类别 | 核心API/工具 | 适用场景 | 性能特点 |
---|---|---|---|
原生API | Bitmap 类 |
基础图像裁剪、旋转、像素操作 | 简单操作,内存消耗高 |
Canvas + Paint |
自定义绘制路径、文字、图形 | 灵活但需手动优化 | |
BitmapFactory |
解码图片(支持采样率压缩) | 支持inSampleSize缩放 | |
硬件加速 | RenderScript |
复杂滤镜、卷积计算 | GPU加速,高性能 |
OpenGL ES |
3D渲染、实时特效 | 最高性能,开发复杂度高 | |
第三方库 | Glide/Picasso | 图片加载与缓存 | 自动内存管理,易集成 |
OpenCV-Android | 计算机视觉算法 | 丰富算法,依赖Native |
内存优化
Bitmap.recycle()
释放内存,或使用BitmapPool
缓存复用。BitmapFactory.Options
设置inSampleSize
降低分辨率, BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; // 宽高缩小为1/4 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img, options);
SoftReference
缓存已处理的Bitmap。性能优化
AsyncTask
或HandlerThread
将耗时操作移出主线程。android:hardwareAccelerated="true"
,优先使用RenderScript
替代手动像素遍历。Paint
和Canvas
实例。兼容性处理
Canvas.isHardwareAccelerated()
。CameraX
或Camera2
获取实时帧数据。RenderScript
对YUV
数据转为RGB
后应用卷积核(例如模糊滤镜): // 创建RenderScript脚本 ScriptC_YuvToRgb yuvToRgb = new ScriptC_YuvToRgb(renderScript); Allocation allocationIn = Allocation.createFromBitmap(renderScript, inputBitmap); Allocation allocationOut = Allocation.createTyped(renderScript, allocationIn.getType()); yuvToRgb.forEach(allocationIn, allocationOut);
TextureView
。原因:直接加载原始分辨率图片导致内存占用过高。
解决方案:
BitmapFactory.Options
的inSampleSize
按比例缩小图片。largeHeap="true"
)。原因:主线程执行耗时操作(如像素遍历、复杂滤镜)。
解决方案:
AsyncTask
或ExecutorService
。RenderScript
或OpenGL
利用GPU加速。解答:
inSampleSize
)。 Bitmap.Config.RGB_565
代替ARGB_8888
(牺牲透明度,节省内存)。 bitmap.recycle()
释放不再使用的Bitmap。 BitmapPool
复用对象。解答:
Bitmap
和Canvas
,开发成本低。 RenderScript
,平衡性能与开发效率。 OpenGL ES
,需具备图形编程基础