Android平台JPEG_R(Ultra HDR)图像保存实现方案咨询
问题描述
我基于修改后的Camera2Raw示例开发,使用Pixel 6 Pro设备,官方相机可保存Ultra HDR图像,但配置ImageFormat.JPEG_R格式的ImageReader时出现“Configuration Failed”错误。即便配置成功,也不清楚如何正确保存JPEG_R图像。目前仅找到桌面端的libultrahdr示例代码,现有常规JPEG与DNG的保存代码如下,求问ImageFormat.JPEG_R对应的保存代码实现方式,是否存在简便方案?
switch (format) { case ImageFormat.JPEG: { ByteBuffer buffer = mImage.getPlanes()[0].getBuffer(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes); FileOutputStream output = null; try { output = new FileOutputStream(mFile); output.write(bytes); success = true; } catch (IOException e) { e.printStackTrace(); } finally { mImage.close(); closeOutput(output); } break; } case ImageFormat.RAW_SENSOR: { DngCreator dngCreator = new DngCreator(mCharacteristics, mCaptureResult); FileOutputStream output = null; try { output = new FileOutputStream(mFile); dngCreator.writeImage(output, mImage); success = true; } catch (IOException e) { e.printStackTrace(); } finally { mImage.close(); closeOutput(output); } break; } }
解决方案
一、先解决ImageReader配置失败问题
- 检查设备能力:确认CameraCharacteristics中
REQUEST_AVAILABLE_CAPABILITIES包含REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT,同时SCALER_STREAM_CONFIGURATION_MAP支持目标尺寸与ImageFormat.JPEG_R的组合。 - 配置CaptureRequest:创建请求时需设置
CONTROL_DYNAMIC_RANGE_PROFILE为CONTROL_DYNAMIC_RANGE_PROFILE_HDR10_PLUS(对应Ultra HDR),且ImageReader的尺寸需与拍照/预览尺寸完全匹配。
二、JPEG_R图像的保存实现
JPEG_R是封装了HDR元数据的标准JPEG格式,其Image数据结构与普通JPEG一致,单Plane包含完整文件流,直接写入即可:
case ImageFormat.JPEG_R: { ByteBuffer buffer = mImage.getPlanes()[0].getBuffer(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes); FileOutputStream output = null; try { output = new FileOutputStream(mFile); output.write(bytes); success = true; } catch (IOException e) { e.printStackTrace(); } finally { mImage.close(); closeOutput(output); } break; }
- 说明:Camera2框架已在捕获阶段完成HDR元数据的封装,无需额外处理,直接写入文件就能生成可被系统识别的Ultra HDR图像。
三、简便方案
- 切换到CameraX开发:CameraX已封装Ultra HDR支持,只需在
ImageCapture.Builder中调用setDynamicRange(DynamicRange.ULTRA_HDR),保存时直接获取数据流写入文件即可,无需手动配置Camera2的复杂参数。 - 利用系统工具类:Android 14及以上版本提供了
androidx.camera.core.imagecapture.UltraHdrImageCapture相关API,可进一步简化HDR图像的捕获与保存流程。
内容的提问来源于stack exchange,提问作者Interstadial
相关产品推荐
相关产品推荐

