成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS開發關于“發送原圖”功能問題的記錄

移動開發 iOS
近期在做“發送原圖”功能的時候,遇到一個bug:在Android、Windows、Mac 客戶端發送原圖,iOS客戶端接收,保存原圖后,原圖物理尺寸不變,存儲空間變小,對應的location等Exif信息丟失。與此同時,iOS客戶端之間互發原圖沒有問題。針對這個問題,做了以下測試調研。

本文主要記錄一個bug從發現、定位到延期解決的過程。文末添加了已踩過的坑

[[208835]]

 

近期在做“發送原圖”功能的時候,遇到一個bug:在Android、Windows、Mac 客戶端發送原圖,iOS客戶端接收,保存原圖后,原圖物理尺寸不變,存儲空間變小,對應的location等Exif信息丟失。與此同時,iOS客戶端之間互發原圖沒有問題。針對這個問題,做了以下測試調研,現記錄下來:

iOS開發關于“發送原圖”功能問題的記錄
微信中發送原圖樣式

一. 首先介紹一下發送一張原圖的流程:

  • 比如 Android 端發送一張原圖,先上傳到 IM 的服務器,上傳成功后再發送消息體;(上傳成功后,服務器會分配三個url分別對應縮略圖、大圖、原圖)
  • 接收方接收到消息體,下載縮略圖;
  • 點擊縮略圖,下載大圖;
  • 再點擊“查看原圖”按鈕,下載原圖;
  • 下載成功后,長按圖片,保存原圖。

二. 問題定位是在***一步,保存圖片的部分:

  • 下載的圖片大小與服務器存儲大小是完全一致的,保存之后大小就發生了變化(目前是“jpg”格式變小,“png”格式圖片變大);
  • 下載的方式分別嘗試了 AFNetwoking 下載、SDWebImage 的普通下載和高級下載方式(因為產品需求要求顯示下載原圖進度)
  • 結論下載的圖片大小與服務器存儲大小是完全一致的是因為在 SDWebImage 高級下載方法的 completionBlock 中有已下載的 bit 值
  • 嘗試了能找到的各種保存圖片的方式,均不行

驗證測試:將安卓端產生的圖片(包括拍照“jpg”和屏幕截圖“png”)從瀏覽器下載到電腦,大小不變,將該圖片文件拖到項目中,執行保存圖片的方法,大小也發生了變化。

補充測試:安卓端拍攝一張圖片(大小為5M),發送給 iOS 客戶端(下載大小為5M),保存(大小為3M),再將該保存的圖片發給安卓客戶端(保存后為3M),安卓客戶端再發送給iOS 客戶端(保存后大小為3M)。結論:該壓縮只會進行一次

保存圖片后,圖片的Exif信息丟失,但是Exif信息的大小遠小于文件損失的大小。圖片物理尺寸沒有發生變化

三. 競品的該功能現狀:

  • Android、Windows、Mac發送原圖,iOS客戶端接收
  • 騰訊系(QQ、WeChat)各端發送接收原圖都沒有問題
  • 釘釘 的圖片變小,Exif 信息丟失
  • BearyChat 發送原圖的圖片變小,Exif 信息丟失
  • Slack 只支持發送圖片,沒有發送原圖功能

四. 基于現有情況的分析

  • iOS 系統在保存圖片的時候,會對圖片進行編解碼操作,可能在位圖上進行優化
  • 一張圖片的存儲大小的計算方式:水平像素垂直像素1色黑白或3基色*顏色深度bit數 = MB數,可能是不同系統的基數不同導致
  • 如果要解決這個問題,要先研究一下圖片編解碼這些很底層的東西,目前來看,性價比很低
  • 如果您之前踩過類似的坑并找到有效的解決方法,方便的話,勞煩請私信告知

五. 補充點干貨

1. 關于iOS11新增的“.heic”格式圖片

什么是“.heic”格式圖片?

之前叫“live”圖片,打開下圖紅框中的按鈕即可打開該模式,拍照后會截取拍照前后大概兩秒的一個片段,與“Gif”圖不同的是,該格式還包含了聲音(目前只有)

[[208836]]

什么樣的手機才能拍出“.heic”格式圖片?

只有在 iOS11系統下且CPU為A10及其以上(***也得是iPhone 7),其他情況下拍出來的都是普通“live”圖,即在需要轉換格式的時候會自動轉換為“.jpg/.jpeg”格式

如何判斷一張圖片是否是“.heic”格式?

SDWebImage-NSData+ImageContentType.m 已更新,剛開始遇到這個問題的時候提了個issue,還讓我提供對應url。。

 

  1. + (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data { 
  2.     if (!data) { 
  3.         return SDImageFormatUndefined; 
  4.     } 
  5.       
  6.     // File signatures table: http://www.garykessler.net/library/file_sigs.html 
  7.     uint8_t c; 
  8.     [data getBytes:&c length:1]; 
  9.     switch (c) { 
  10.         case 0xFF: 
  11.             return SDImageFormatJPEG; 
  12.         case 0x89: 
  13.             return SDImageFormatPNG; 
  14.         case 0x47: 
  15.             return SDImageFormatGIF; 
  16.         case 0x49: 
  17.         case 0x4D: 
  18.             return SDImageFormatTIFF; 
  19.         case 0x52: { 
  20.             if (data.length >= 12) { 
  21.                 //RIFF....WEBP 
  22.                 NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; 
  23.                 if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { 
  24.                     return SDImageFormatWebP; 
  25.                 } 
  26.             } 
  27.             break; 
  28.         } 
  29.         case 0x00: { 
  30.             if (data.length >= 12) { 
  31.                 //....ftypheic ....ftypheix ....ftyphevc ....ftyphevx 
  32.                 NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(4, 8)] encoding:NSASCIIStringEncoding]; 
  33.                 if ([testString isEqualToString:@"ftypheic"
  34.                     || [testString isEqualToString:@"ftypheix"
  35.                     || [testString isEqualToString:@"ftyphevc"
  36.                     || [testString isEqualToString:@"ftyphevx"]) { 
  37.                     return SDImageFormatHEIC; 
  38.                 } 
  39.             } 
  40.             break; 
  41.         } 
  42.     } 
  43.     return SDImageFormatUndefined; 
  44. + (nonnull CFStringRef)sd_UTTypeFromSDImageFormat:(SDImageFormat)format { 
  45.     CFStringRef UTType; 
  46.     switch (format) { 
  47.         case SDImageFormatJPEG: 
  48.             UTType = kUTTypeJPEG; 
  49.             break; 
  50.         case SDImageFormatPNG: 
  51.             UTType = kUTTypePNG; 
  52.             break; 
  53.         case SDImageFormatGIF: 
  54.             UTType = kUTTypeGIF; 
  55.             break; 
  56.         case SDImageFormatTIFF: 
  57.             UTType = kUTTypeTIFF; 
  58.             break; 
  59.         case SDImageFormatWebP: 
  60.             UTType = kSDUTTypeWebP; 
  61.             break; 
  62.         case SDImageFormatHEIC: 
  63.             UTType = kSDUTTypeHEIC; 
  64.             break; 
  65.         default
  66.             // default is kUTTypePNG 
  67.             UTType = kUTTypePNG; 
  68.             break; 
  69.     } 
  70.     return UTType; 

對于“.heic”格式圖片我們應該怎么處理?

  • 首先肯定不是服務器去支持這個類型,因為 Windows、Android 是不支持該類型的圖片正常顯示的,尤其是 Windows 明確表示以后也不會支持。
  • 微信目前的處理方式是轉換成了 jpg 格式,因此直接使用 UIImageJPEGRepresentation(originalImage, 0.82); 轉換為jpg即可
  • 但是經多次測試后發現,必須設置壓縮比為0.82,轉換后的大小才盡可能的接近原圖大小

 

責任編輯:未麗燕 來源: si1ence
相關推薦

2014-05-06 09:44:54

MySQL LogsMySQL

2013-06-03 16:27:49

iOS開發移動應用移動開發

2011-05-11 10:02:37

iOS

2013-07-21 18:18:00

iOS開發ASIHttpRequ

2014-03-12 10:13:00

iOSSEL對象

2015-09-10 09:10:46

2011-08-02 11:30:41

iOS開發 郵件發送

2015-07-15 10:37:10

IOS用戶行為統計代碼

2013-07-23 07:24:57

iOS開發學習iOS開發問題集錦

2014-06-10 13:44:58

iOSUIImage知識點

2013-06-13 09:03:15

iOS7WWDC蘋果

2011-08-18 11:19:13

IOS開發Core Plot S

2013-05-27 13:37:42

Android開發移動開發屏幕截圖

2010-05-11 10:43:10

Unix awk

2011-07-08 14:09:51

iPhone UI

2013-09-02 15:26:44

.NET開發郵件系統.Net

2011-08-09 10:27:41

iOS剪貼板

2012-10-08 12:59:01

iOS 6.0開發框架功能更新

2009-11-26 15:16:44

Cisco路由器IOS

2014-02-19 09:51:29

iOS開發時間處理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品在欧美一区二区少妇 | 欧美一区二区大片 | 国产精品免费一区二区 | 97免费在线观看视频 | 综合网伊人 | 久久精品成人一区 | 久久久久久久久久久久久9999 | 亚洲伊人久久综合 | 久久久精品影院 | 精品免费视频 | 欧美高清视频一区 | 国产色片在线 | 99久久电影| 欧美日韩在线观看视频网站 | 国产一区在线免费观看视频 | 欧美亚洲网站 | 91av大全 | 中文字幕亚洲视频 | 18gay男同69亚洲网站 | 精品在线一区二区三区 | 色秀网站 | 亚洲精品视频网站在线观看 | 精品视频一区二区三区在线观看 | 天天色图 | 91网站视频在线观看 | 欧美久久久网站 | 蜜桃av一区二区三区 | 亚洲欧美精品在线 | 亚洲精品久久久一区二区三区 | 久久久久久av | 亚洲一区二区三区在线视频 | 91精品国产色综合久久不卡蜜臀 | 久久久2o19精品 | 国产精品.xx视频.xxtv | 久久久一二三区 | 亚洲精品成人在线 | 免费观看的黄色网址 | 色黄网站 | 欧美老少妇一级特黄一片 | 日韩在线精品强乱中文字幕 | 免费在线一区二区三区 |