本文主要记录一个bug从发现、定位到延期解决的过程。文末添加了已踩过的坑
近期在做“发送原图”功能的时候,遇到一个bug:在Android、Windows、Mac 客户端发送原图,iOS客户端接收,保存原图后,原图物理尺寸不变,存储空间变小,对应的location等Exif信息丢失。与此同时,iOS客户端之间互发原图没有问题。针对这个问题,做了以下测试调研,现记录下来:
是因为在SDWebImage高级下载方法的 completionBlock 中有已下载的 bit 值
- 下载的图片大小与服务器存储大小是完全一致的
:将安卓端产生的图片(包括拍照“jpg”和屏幕截图“png”)从浏览器下载到电脑,大小不变,将该图片文件拖到项目中,执行保存图片的方法,大小也发生了变化。
- 验证测试
:安卓端拍摄一张图片(大小为5M),发送给 iOS 客户端(下载大小为5M),保存(大小为3M),再将该保存的图片发给安卓客户端(保存后为3M),安卓客户端再发送给iOS 客户端(保存后大小为3M)。结论:该压缩只会进行一次
- 补充测试
Android、Windows、Mac发送原图,iOS客户端接收
如果您之前踩过类似的坑并找到有效的解决方法,方便的话,劳烦请私信告知
即可打开该模式,拍照后会截取拍照前后大概两秒的一个片段,与“Gif”图不同的是,该格式还包含了声音(目前只有)
- 下图红框中的按钮
- + (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;
- }
转换为jpg即可
- UIImageJPEGRepresentation(originalImage, 0.82);
最后,说点正经的,这是一篇每个iOS开发人员都应该了解的文章 iOS11/iPhone X 适配简单,但你的Apple思维适配做好了么?
再说点不正经的,如果你很愉悦的看完了本文并且学到了知识,那么这篇文章你应该也会喜欢NavigationController已经洗干净了,就等你来
来源: https://juejin.im/entry/59fc1a305188252abc5db836