2018-08-15 iOS展示超大圖片或超高分辨率圖片崩潰解決方法

轉(zhuǎn)載:https://blog.csdn.net/u014544904/article/details/76439259

前言:

ID作為一款以IM為基礎(chǔ)的辦公軟件卷要,在用戶使用過程中为牍,經(jīng)常會遇到一些超大的或者超高分辨率的圖片(以下統(tǒng)一稱:大圖)剿吻。基于SDWebImage為基礎(chǔ)的圖片加載控件洋魂,在遇到此情況時歧蕉,并沒有提供十分有效的解決方法(如果你谷歌或者百度委煤,有很多回答,但實際并未能解決此問題)棒卷。曾經(jīng)一度困擾許久」四酰現(xiàn)在將我的解決方式寫下來,希望可以對你有所幫助比规。

參考:

作為IM軟件的領(lǐng)軍岩齿,QQ與微信無疑給IM行業(yè)樹立了一個很好的榜樣。那我們就來看看它們是如何處理的(以下簡單描述苞俘,自己可以實際體驗):

QQ:

點(diǎn)擊大圖瀏覽時盹沈,會有一個轉(zhuǎn)圈等待操作,對圖片放大的大小無限制。在放大過程中乞封,圖片會模糊做裙,停止操作后,一張清晰的高清圖渲染出來肃晚。如果圖片過大并分辨率超高(上萬)锚贱,會出現(xiàn)崩潰。

微信:

點(diǎn)擊大圖瀏覽時关串,直接展示拧廊。但是對圖片展示大小有限制。放大到一定程度晋修,無法繼續(xù)放大查看吧碾。

做為辦公軟件,無需解釋墓卦,很明顯QQ的方式更符合需求倦春。

實現(xiàn):

對于大圖,壓縮肯定使我們需要的落剪,QQ轉(zhuǎn)圈等待同樣我猜測也是壓縮操作睁本。

壓縮:

壓縮圖片我們希望可以保證壓縮的速度夠快及內(nèi)存消耗的盡可能小。在此感謝github上的OTLargeImageReader的作者忠怖,壓縮過程中內(nèi)存控制和速度都很好呢堰。

關(guān)鍵代碼:

//先從內(nèi)存中查找,查找不到再解碼凡泣,避免重復(fù)解碼

UIImage*cacheImage = [self.photoBrowser cacheImageWithPhoto:_photo];

if(cacheImage ==nil) {

//不存在枉疼,解碼

[self.photoBrowser showHUDWithSuperBigPhoto];

dispatch_async(dispatch_get_global_queue(0,0), ^{

CGSizecompressSize =CGSizeMake(XXPhotoCompressPixelMax, XXPhotoCompressPixelMax);

if(image.size.width > image.size.height) {

compressSize =CGSizeMake(XXPhotoCompressPixelMax, XXPhotoCompressPixelMax*image.size.height/image.size.width);

? ? ? ? }

else{

compressSize =CGSizeMake(XXPhotoCompressPixelMax*image.size.width/image.size.height, XXPhotoCompressPixelMax);

? ? ? ? }

UIImage*compressedImage = [image imageByScalingProportionallyToSize:compressSize];

dispatch_async(dispatch_get_main_queue(), ^{

[self.photoBrowser cacheImageWithPhoto:_photo image:compressedImage];

self.showImageView.image = compressedImage;

[self.photoBrowser hideHUDWithSuperBigPhoto];

[selfresetSize];

? ? ? ? });

? ? });

}

else{

//直接使用

self.showImageView.image = cacheImage;

}

通過以上方式,加上參考QQ的交互方式问麸,此時往衷,一張分辨率有限的大圖在經(jīng)過短暫壓縮處理后,已經(jīng)可以非常安全的在app中展示瀏覽了(緩存壓縮圖片避免重復(fù)壓縮)严卖。但是席舍,壓縮過的圖片放大后,模糊不清了哮笆!這不能忍来颤,繼續(xù)搞。

當(dāng)在QQ中瀏覽圖片進(jìn)行放大時稠肘,可以很輕易的發(fā)現(xiàn)福铅,此時的圖片也是模糊的(這就印證了轉(zhuǎn)圈過程中對圖片的壓縮操作),然而當(dāng)我們停止放大操作后项阴,當(dāng)前展示的模糊圖被重新渲染展示給我們滑黔,清晰,完美!

此時略荡,如果你遇到過這個問題庵佣,并且嘗試過解決,你肯定找到了蘋果官方提供的Demo以及一些分塊加載的方式汛兜。這個成本太高巴粪,不建議耙箍。

思來想去多律,一個新的方式出現(xiàn)了:用戶在這個大圖中,關(guān)注的只有當(dāng)前屏幕中展示的這一區(qū)域的圖片活鹰,當(dāng)用戶不操作圖片時漏策,拿到圖片在手機(jī)屏幕上的元素覆蓋展示出來派哲。用戶操作時,移除覆蓋圖層哟玷,停止后重新操作狮辽。

裁剪圖片:

裁剪當(dāng)前屏幕中展示對應(yīng)原圖中的位置

- (void)didCutImage {

if(_orImage) {

if(self.scrollView.contentSize.width >= kScreenWidth &&

self.scrollView.contentSize.height >= kScreenHeight) {

CGFloatmultipleF = _orImage.size.width/self.scrollView.contentSize.width;

CGFloatwidth = kScreenWidth*multipleF;

CGFloatheight = kScreenHeight *multipleF;

//如果剪切的尺寸過大一也,不處理

if(width > XXPhotoPixelMax ||

? ? ? ? ? ? ? ? height > XXPhotoPixelMax) {

return;

? ? ? ? ? ? }

//如果剪切的尺寸過大巢寡,不處理

//裁剪展示視圖

if(_bigCupImageView) {

_bigCupImageView.frame =CGRectMake(self.scrollView.contentOffset.x,self.scrollView.contentOffset.y, kScreenWidth, kScreenHeight);

? ? ? ? ? ? }

else{

[self.scrollView addSubview:self.bigCupImageView];

? ? ? ? ? ? }

//裁剪展示視圖

CGImageRefcgRef = _orImage.CGImage;

CGImageRefimageRef =CGImageCreateWithImageInRect(cgRef,CGRectMake(self.scrollView.contentOffset.x *multipleF? ,self.scrollView.contentOffset.y *multipleF, width, height));

UIImage*thumbScale = [UIImageimageWithCGImage:imageRef];

CGImageRelease(imageRef);

self.bigCupImageView.image = thumbScale;

? ? ? ? }

? ? }

}

在這個過程中,仍需要注意的是椰苟,何時展示與隱藏剪切出來的圖片抑月。

覆蓋圖片的添加與移除:

添加:

- (void)scrollViewDidScroll:(UIScrollView*)scrollView {

[NSObjectcancelPreviousPerformRequestsWithTarget:self];

[selfperformSelector:@selector(didCutImage) withObject:nilafterDelay:.5];

}

移除:

- (void)scrollViewWillBeginZooming:(UIScrollView*)scrollView withView:(nullableUIView*)view {

if(_bigCupImageView) {

? ? ? ? [_bigCupImageView removeFromSuperview];

_bigCupImageView =nil;

? ? }

}

結(jié)語:

此解決方式在實現(xiàn)上非常簡單,開始只是困于思路舆蝴。如果你有其他的方式谦絮,那我們就開始一段愉快的交流吧!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洁仗,一起剝皮案震驚了整個濱河市层皱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赠潦,老刑警劉巖叫胖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異她奥,居然都是意外死亡瓮增,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門哩俭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绷跑,“玉大人,你說我怎么就攤上這事凡资≡夷螅” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垦藏。 經(jīng)常有香客問我吩谦,道長,這世上最難降的妖魔是什么膝藕? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任式廷,我火速辦了婚禮,結(jié)果婚禮上芭挽,老公的妹妹穿的比我還像新娘滑废。我一直安慰自己,他們只是感情好袜爪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布蠕趁。 她就那樣靜靜地躺著,像睡著了一般辛馆。 火紅的嫁衣襯著肌膚如雪俺陋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天昙篙,我揣著相機(jī)與錄音腊状,去河邊找鬼。 笑死苔可,一個胖子當(dāng)著我的面吹牛缴挖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播焚辅,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼映屋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了同蜻?” 一聲冷哼從身側(cè)響起棚点,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎湾蔓,沒想到半個月后瘫析,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卵蛉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年颁股,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傻丝。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡甘有,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出葡缰,到底是詐尸還是另有隱情亏掀,我是刑警寧澤忱反,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站滤愕,受9級特大地震影響温算,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜间影,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一注竿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧魂贬,春花似錦巩割、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至键科,卻和暖如春闻丑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勋颖。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工嗦嗡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牙言。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓酸钦,卻偏偏與公主長得像怪得,于是被迫代替她去往敵國和親咱枉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • #import @class XRCarouselView;typedef void(^ClickBlock)(N...
    猛大不萌閱讀 520評論 0 0
  • 生活經(jīng)驗越是豐富,對所有支持越是感激入挣,一句好話亿乳,一張字條,片言只語径筏,都會珍惜葛假。
    小圓臉兒閱讀 224評論 0 0
  • 今天我讀了一本故事書,名字叫《半途而廢》滋恬。故事是:樂羊子家里很窮聊训。一天,樂羊子撿到了一個金子恢氯。他飛快地跑回去對妻子...
    祉延閱讀 199評論 2 6
  • 常言道带斑,耐得住寂寞的人才能不寂寞鼓寺,耐不住寂寞的人偏偏寂寞。寂寞讓人茫然勋磕,讓人苦思妈候,讓人痛苦,也讓人生的價值得以升華...
    不正式青年閱讀 311評論 3 1