本文主要记录一个bug从发现、定位到延期解决的过程。文末添加了已踩过的坑
近期在做“发送原图”功能的时候,遇到一个bug:在Android、Windows、Mac 客户端发送原图,iOS客户端接收,保存原图后,原图物理尺寸不变,存储空间变小,对应的location等Exif信息丢失。与此同时,iOS客户端之间互发原图没有问题。针对这个问题,做了以下测试调研,现记录下来:
一. 首先介绍一下发送一张原图的流程:
二. 问题定位是在***一步,保存图片的部分:
验证测试:将安卓端产生的图片(包括拍照“jpg”和屏幕截图“png”)从浏览器下载到电脑,大小不变,将该图片文件拖到项目中,执行保存图片的方法,大小也发生了变化。
补充测试:安卓端拍摄一张图片(大小为5M),发送给 iOS 客户端(下载大小为5M),保存(大小为3M),再将该保存的图片发给安卓客户端(保存后为3M),安卓客户端再发送给iOS 客户端(保存后大小为3M)。结论:该压缩只会进行一次
保存图片后,图片的Exif信息丢失,但是Exif信息的大小远小于文件损失的大小。图片物理尺寸没有发生变化
三. 竞品的该功能现状:
四. 基于现有情况的分析
五. 补充点干货
1. 关于iOS11新增的“.heic”格式图片
什么是“.heic”格式图片?
之前叫“live”图片,打开下图红框中的按钮即可打开该模式,拍照后会截取拍照前后大概两秒的一个片段,与“Gif”图不同的是,该格式还包含了声音(目前只有)
什么样的手机才能拍出“.heic”格式图片?
只有在 iOS11系统下且CPU为A10及其以上(***也得是iPhone 7),其他情况下拍出来的都是普通“live”图,即在需要转换格式的时候会自动转换为“.jpg/.jpeg”格式
如何判断一张图片是否是“.heic”格式?
SDWebImage-NSData+ImageContentType.m 已更新,刚开始遇到这个问题的时候提了个issue,还让我提供对应url。。
- + (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data {
- if (!data) {
- return SDImageFormatUndefined;
- }
- // File signatures table: http://www.garykessler.net/library/file_sigs.html
- uint8_t c;
- [data getBytes:&c length:1];
- switch (c) {
- case 0xFF:
- return SDImageFormatJPEG;
- case 0x89:
- return SDImageFormatPNG;
- case 0x47:
- return SDImageFormatGIF;
- case 0x49:
- case 0x4D:
- return SDImageFormatTIFF;
- case 0x52: {
- if (data.length >= 12) {
- //RIFF....WEBP
- NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
- if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
- return SDImageFormatWebP;
- }
- }
- break;
- }
- case 0x00: {
- if (data.length >= 12) {
- //....ftypheic ....ftypheix ....ftyphevc ....ftyphevx
- NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(4, 8)] encoding:NSASCIIStringEncoding];
- if ([testString isEqualToString:@"ftypheic"]
- || [testString isEqualToString:@"ftypheix"]
- || [testString isEqualToString:@"ftyphevc"]
- || [testString isEqualToString:@"ftyphevx"]) {
- return SDImageFormatHEIC;
- }
- }
- break;
- }
- }
- return SDImageFormatUndefined;
- }
- + (nonnull CFStringRef)sd_UTTypeFromSDImageFormat:(SDImageFormat)format {
- CFStringRef UTType;
- switch (format) {
- case SDImageFormatJPEG:
- UTType = kUTTypeJPEG;
- break;
- case SDImageFormatPNG:
- UTType = kUTTypePNG;
- break;
- case SDImageFormatGIF:
- UTType = kUTTypeGIF;
- break;
- case SDImageFormatTIFF:
- UTType = kUTTypeTIFF;
- break;
- case SDImageFormatWebP:
- UTType = kSDUTTypeWebP;
- break;
- case SDImageFormatHEIC:
- UTType = kSDUTTypeHEIC;
- break;
- default:
- // default is kUTTypePNG
- UTType = kUTTypePNG;
- break;
- }
- return UTType;
- }
对于“.heic”格式图片我们应该怎么处理?
机器学习怎么入门最简单?今年刚刚从哈佛大学统计专业毕业的 Danny Friedman 写...
近几年,随着互联网和信息技术的飞速发展,网约车平台如雨后春笋般进入我们的生...
早在 2019 年 9 月,Google 开发「Google Card」的消息就曾传出,近日更是谍照外...
介绍 当一个类的观察值高于其他类的观察值时,则存在类失衡。 示例:检测信用卡...
9月29日消息,昨日晚间23 时 59 分,腾讯微博正式停止运营。目前用户已无法登录...
各国政府应像其他经济和社会进步一样重视AI和数据竞争力。 对研究和技术素养的投...
商用不过1年光景,眼下我国5G用户已从无到有达到2.4亿高居全球第一。记者12月25...
一项技术若有真正用武之地,必须与商业结合,在提升生产效率和解决生活问题上发...
11月26日,由绿色计算产业联盟(Green Computing Consortium,简称GCC)主办的2020...
如今,大多数围绕人工智能(AI)的讨论都集中在自动驾驶汽车、聊天机器人、数字孪...