使用AWS Rekognition对比S3图片时遇InvalidImageFormatException问题
问题背景
尝试使用AWS Rekognition对比S3存储桶内的两张图片时,触发InvalidImageFormatException错误。已确认图片存在于S3中,且Rekognition凭证具备S3读取权限,按规范通过S3Object指定了正确的桶名和图片名,但报错依旧。同时疑惑为何官方提供的S3Object读取方式无法使用,是否需要将图片转为base64或ByteBuffer格式。
初始代码:
String reference = "reference.jpg"; String target = "selfie.jpg"; String bucket = "pruebas"; CompareFacesRequest request = new CompareFacesRequest() .withSourceImage(new Image().withS3Object(new S3Object() .withName(reference).withBucket(bucket))) .withTargetImage(new Image().withS3Object(new S3Object() .withName(target).withBucket(bucket))) .withSimilarityThreshold(similarityThreshold); AmazonRekognition rekognitionClient = AmazonRekognitionClientBuilder.standard() .withRegion(Regions.US_EAST_1).build(); CompareFacesResult compareFacesResult= rekognitionClient.compareFaces(request);
错误信息:
Exception in thread "main" com.amazonaws.services.rekognition.model.InvalidImageFormatException: Request has invalid image format (Service: AmazonRekognition; Status Code: 400; Error Code: InvalidImageFormatException;
更新后的代码改为从S3拉取字节流传入,但问题仍未解决,寻求解决方案。
解决方案
验证图片格式与编码合规性
Rekognition仅支持JPEG、PNG、BMP、GIF(仅第一帧)、TIFF格式,且要求图片为RGB编码(不支持CMYK)。检查你的图片:- 确认后缀名与实际格式一致(比如不要把WebP文件重命名为.jpg)
- 用图片工具(如GIMP、Photoshop)重新导出为标准RGB格式的JPEG/PNG,上传回S3后重试。
修正S3对象的Content-Type元数据
使用S3Object方式传递图片时,Rekognition会依赖S3对象的Content-Type元数据判断格式。若元数据错误(比如JPEG图片的Content-Type设为application/octet-stream),会直接触发格式错误。
修复步骤:在S3控制台找到对应对象,进入「元数据」设置页,修改为正确的类型(JPEG设为image/jpeg,PNG设为image/png)。统一SDK客户端的区域配置
你更新后的代码中,S3客户端使用US_EAST_1区域,但Rekognition客户端使用US_EAST_2。虽然跨区域调用本身允许,但可能因跨区域访问的隐性限制导致图片读取异常。建议将两个客户端的区域统一,或确保S3桶未设置跨区域访问的限制策略。确认字节流读取的完整性
检查getObjectBytes方法拉取的字节流是否完整:可以将字节流写入本地文件,验证文件能否正常打开,确认未出现数据截断或损坏。替换不安全的字节流创建方式
避免使用SdkBytes.fromByteArrayUnsafe,该方法不会复制字节数组,若后续数组被修改可能导致数据异常。改用SdkBytes.fromByteArray(sourceStream),确保数据的安全性和完整性。
内容的提问来源于stack exchange,提问作者Eduardo Nicolalde

