问题描述
用户反馈IOS手机在动态社区列表中有的图片显示不出来
问题排查
简单了解了下,之前项目商定的图片格式,对于HEIF的图片统一处理成jpeg的格式上传,ios端已经处理,Android端对于heif的图片还是直接上传的,所以对未适配heif格式的手机会显示不出来的情况。
关于HEIF:
没有了解过,自己的小米10s测试机在拍照是可以设置打开HEIF格式的开关
打开开关后拍出的照片就是heic格式的了。
小米还提供了一个设置是发送第三方自动转发jpeg格式,比较人性化。
但对于这种格式的图片直接上传到图床,对于部分手机就会有不显示的情况了。
解决
问题的场景是Android端的用户上传了本地heif格式的图片到图床,其他用户会有显示问题,稳妥的做法是对于heif的格式要先本地转换成jpeg的图片再做上传操作。
、
阿里云上传图片的代码如下:
Single.defer {
///.......
val request = PutObjectRequest(bucket, remotePath, tempLocalPath)
val metadata = ObjectMetadata()
if (!TextUtils.isEmpty(mimeType)) {
metadata.contentType = mimeType
}
request.metadata = metadata
getAliClient(endPoint).putObject(request)
//......
将图片转换的工作放到这一步做,判断是否是heif的格式图片,如果是就转化图片为Jpeg到新的缓存路径下,将原来的上传地址替换为转换后的地址即可:
var tempLocalPath = localPath
if (FileUtils.isHeifImage(localPath)) {
tempLocalPath = FileUtils.convertHeif2Jpgeg(localPath)
}
//.......
转换的代码:
public static String convertHeif2Jpgeg(String heifPath) {
String savePath = Utils.getApp().getApplicationContext().getExternalCacheDir().getAbsolutePath() + File.separator + "convertImage";
Bitmap bitmap = BitmapFactory.decodeFile(heifPath);
File file = null;
if (bitmap != null) {
file = new File(savePath,Md5Utils.md5(heifPath) + TEMP_HEIC_CONVERT_IMG_NAME);
if (!file.exists()) {
file.mkdirs();
ImageUtils.save(bitmap, file, Bitmap.CompressFormat.JPEG, true);
}
}
return file !=null ? file.getAbsolutePath() : "";
}
这里选择将图片缓存到应用的外部私有缓存目录下,这里选择对path路径hash一下,为了避免重复的转换工作,转换之后将保存的图片路径返回上传的图床即可。