亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > iOS > 正文

iOS中大尺寸圖片的旋轉(zhuǎn)與縮放實(shí)例詳解

2019-10-21 18:39:51
字體:
供稿:網(wǎng)友

前言

由于iPhone的硬件性能限制,直到iPhone 6s開始,才將最大內(nèi)存拓展到2G。

可即使是如此,也不代表一個(gè)應(yīng)用可使用的空間是2G。

一張10000 x 10000的圖片,如果通過UIImageJPEGRepresentation方法將圖片轉(zhuǎn)成內(nèi)存數(shù)據(jù),會有一個(gè)峰值波動。

這里的峰值其實(shí)是圖片在解壓時(shí)產(chǎn)生的位圖數(shù)據(jù)所占空間,然后才轉(zhuǎn)換成我們可以操作的NSData。

其計(jì)算公式是 W x H x 4 / 1024 / 1024 也就是 10000 x 10000 x4 /1024 / 1024 = 381.4(M)。

這里會產(chǎn)生381M的消耗,及時(shí)會被回收,但是想一下,如果圖片尺寸很大,數(shù)量很多的時(shí)候,很容易就會發(fā)生異常了。

本文將給大家詳細(xì)介紹關(guān)于iOS大尺寸圖片旋轉(zhuǎn)縮放的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),話不多說了,接下來說下具體的操作

旋轉(zhuǎn)

我們知道如果對一個(gè)UIImage對象進(jìn)行旋轉(zhuǎn)操作,相信做項(xiàng)目時(shí)肯定會有用到 UIImage 這個(gè)類,可以有如下的方式

通過 CGContextDrawImage 進(jìn)行圖片繪制

+ (UIImage *)image:(UIImage *)image rotation:(UIImageOrientation)orientation { long double rotate = 0.0; CGRect rect; float translateX = 0; float translateY = 0; float scaleX = 1.0; float scaleY = 1.0; switch (orientation) { case UIImageOrientationLeft: rotate = M_PI_2; rect = CGRectMake(0, 0, image.size.height, image.size.width); translateX = 0; translateY = -rect.size.width; scaleY = rect.size.width/rect.size.height; scaleX = rect.size.height/rect.size.width; break; default: rotate = 0.0; rect = CGRectMake(0, 0, image.size.width, image.size.height); translateX = 0; translateY = 0; break; } UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); //做CTM變換 CGContextTranslateCTM(context, 0.0, rect.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextRotateCTM(context, rotate); CGContextTranslateCTM(context, translateX, translateY); CGContextScaleCTM(context, scaleX, scaleY); //繪制圖片 CGContextDrawImage(context, CGRectMake(0, 0, rect.size.width, rect.size.height), image.CGImage); UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext(); return newPic;} 

這里有一個(gè)問題是,這里會創(chuàng)建一個(gè)新的圖片大小空間的,然后進(jìn)行重新繪制??赡軙嬖谝粋€(gè)隱患,就是當(dāng)圖片尺寸過大的時(shí)候,就會出現(xiàn)內(nèi)存占用過高的情況

接下來介紹一種另辟蹊徑的解決方法--通過給圖片添加濾鏡的方式。

既然操作的對象是圖片,那么它就會各種濾鏡展示。系統(tǒng)給我們提供了多大一百多種濾鏡,這里的濾鏡不單只顏色等狀態(tài)發(fā)生變化。

這其中就有我們需要的濾鏡Key inputTransform。

+ (UIImage *)getRotationImage:(UIImage *)image rotation:(CGFloat)rotation { CIImage *ciImage = [[CIImage alloc] initWithImage:image]; CIFilter *filter = [CIFilter filterWithName:@"CIAffineTransform" keysAndValues:kCIInputImageKey, ciImage, nil]; [filter setDefaults]; CGAffineTransform transform = CATransform3DGetAffineTransform([self rotateTransform:CATransform3DIdentity clockwise:NO angle:rotation]); [filter setValue:[NSValue valueWithBytes:&transform objCType:@encode(CGAffineTransform)] forKey:@"inputTransform"]; //根據(jù)濾鏡設(shè)置圖片 CIContext *context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(NO)}]; CIImage *outputImage = [filter outputImage]; CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]]; UIImage *result = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); return result;}+ (CATransform3D)rotateTransform:(CATransform3D)initialTransform clockwise:(BOOL)clockwise angle:(CGFloat)angle { CGFloat arg = angle*M_PI / 180.0f; if(!clockwise){ arg *= -1; } //進(jìn)行形變 CATransform3D transform = initialTransform; transform = CATransform3DRotate(transform, arg, 0, 0, 1); CGFloat _flipState1 = 0; CGFloat _flipState2 = 0; transform = CATransform3DRotate(transform, _flipState1*M_PI, 0, 1, 0); transform = CATransform3DRotate(transform, _flipState2*M_PI, 1, 0, 0); return transform;} 

通過這種操作,可以利用GPU來進(jìn)行圖片操作,可以一定程度的降低消耗,節(jié)約資源。

縮放

既然圖片很大,那么我們可以通過縮放的方式,來減小圖片的尺寸,減少內(nèi)存消耗,進(jìn)而降低異常風(fēng)險(xiǎn)。

我們通常采用UIImage提供的系統(tǒng)方法drawInRect 及其一系列的方法,來進(jìn)行圖片縮放。

可是這種操作的缺陷和最開始介紹的旋轉(zhuǎn)一樣,其實(shí)質(zhì)都是進(jìn)行圖片的重新繪制。

通過繪制圖片的方式進(jìn)行圖片縮放

+ (UIImage *)image:(UIImage *)image transformtoSize:(CGSize)Newsize { // 創(chuàng)建一個(gè)bitmap的context UIGraphicsBeginImageContext(Newsize); // 繪制改變大小的圖片 [image drawInRect:CGRectMake(0, 0, Newsize.width, Newsize.height)]; // 從當(dāng)前context中創(chuàng)建一個(gè)改變大小后的圖片 UIImage *TransformedImg=UIGraphicsGetImageFromCurrentImageContext(); // 使當(dāng)前的context出堆棧 UIGraphicsEndImageContext(); // 返回新的改變大小后的圖片 return TransformedImg;}

這里是內(nèi)存消耗。通過看圖可以發(fā)現(xiàn),針對大圖,在進(jìn)行縮放的時(shí)候,內(nèi)存消耗的峰值能達(dá)到426M,耗時(shí)在1.5s左右
由于我們使用的手機(jī)是iPhone X,在更低端的設(shè)備上,這是多么大的損耗,很容易發(fā)生異常

iOS,大尺寸圖片,旋轉(zhuǎn),縮放

既然上面的方法損耗很大,我們來看下另外的一種方式。

先看下內(nèi)存消耗

iOS,大尺寸圖片,旋轉(zhuǎn),縮放

通過圖上可以看出,在進(jìn)行圖片縮放的時(shí)候,內(nèi)存有小幅增加,產(chǎn)生的消耗在18M,耗時(shí)也在1.5s左右。

這樣的效果是非常顯著的。下面來看代碼

+(UIImage *)resizeImage:(UIImage *)image toSize:(CGSize)size { CIImage *ciImage = [[CIImage alloc] initWithImage:image]; //創(chuàng)建一個(gè)input image類型的濾鏡 CIFilter *filter = [CIFilter filterWithName:@"CIAffineTransform" keysAndValues:kCIInputImageKey, ciImage, nil]; //設(shè)置默認(rèn)的濾鏡效果 [filter setDefaults]; //設(shè)置縮放比例 CGFloat scale = 1; if (size.width != CGFLOAT_MAX) { scale = (CGFloat) size.width / image.size.width; } else if (size.height != CGFLOAT_MAX) { scale = (CGFloat) size.height / image.size.height; } //進(jìn)行賦值 CGAffineTransform transform = CGAffineTransformMakeScale(scale, scale); [filter setValue:[NSValue valueWithBytes:&transform objCType:@encode(CGAffineTransform)] forKey:@"inputTransform"]; //通過GPU的方式來進(jìn)行處理 CIContext *context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(NO)}]; //根據(jù)濾鏡輸出圖片 CIImage *outputImage = [filter outputImage]; CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]]; //創(chuàng)建UIImage 對象,并釋放資源 UIImage *result = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); return result;}

可以發(fā)現(xiàn)我們這里使用的和旋轉(zhuǎn)是同樣的方式。通過給圖片添加濾鏡能夠很安全的實(shí)現(xiàn)我們的需求。

總結(jié)

1.針對巨幅圖片操作,可以采用這種思路:先生成一個(gè)尺寸小的縮略圖,然后在進(jìn)行各種操作,可以降低資源消耗;

2.通過CoreImage.framework來進(jìn)行圖片處理。

3.之前一直對CoreImage.framework的理解,只是其能夠?qū)D片和視頻添加那種可見的濾鏡,未曾想過這種濾鏡也支持縮放和旋轉(zhuǎn)。

? 為什么CoreImage.framework的方式能夠很安全呢?

該框架從iOS 5開始投入使用,通過對CoreGraphics.framework、CoreVideo.framework、Image I/O.framework進(jìn)行數(shù)據(jù)處理,

可以自由在CPU和GPU之間切換運(yùn)算方式,

可以最大限度的利用GPU來進(jìn)行計(jì)算,降低內(nèi)存消耗,

甚至可以對視頻進(jìn)行實(shí)時(shí)濾鏡處理。

針對不能通過原生對UIView進(jìn)行transform操作的時(shí)候,CoreImage.framework會是你的朋友。

最直接的來自文檔

Core Image is an image processing and analysis technology designed to provide near real-time processing for still and video images. It operates on image data types from the Core Graphics, Core Video, and Image I/O frameworks, using either a GPU or CPU rendering path. Core Image hides the details of low-level graphics processing by providing an easy-to-use application programming interface (API). You don't need to know the details of OpenGL, OpenGL ES, or Metal to leverage the power of the GPU, nor do you need to know anything about Grand Central Dispatch (GCD) to get the benefit of multicore processing. Core Image handles the details for you.

它已經(jīng)幫你把所有東西都處理好了,大膽的用吧

代碼地址

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
伊人免费视频| 在线午夜精品| 天天干天天做天天操| 欧美极品少妇videossex| 日日干日日操日日射| 欧美日韩亚洲成人| 精品婷婷色一区二区三区蜜桃| 亚洲一卡二卡三卡| 日韩免费福利视频| 亚洲女人天堂在线| 成人影音在线| 在线不卡视频| www国产无套内射com| 亚洲视频第二页| 日韩成人性视频| 国产.com| 精品入口麻豆传煤| 日韩欧美视频免费在线观看| 精品网站aaa| 国产91丝袜在线播放| 色网在线观看| 性爱视频在线播放| 日韩精品视频在线播放| 欧美日本亚洲| 一级毛片免费观看| 欧美黑人巨大| 色综合久久综合网欧美综合网| 国模大尺度视频一区二区| 26uuu精品一区二区三区四区在线| 视频在线不卡| 中文在线√天堂| 人人影院免费大片| 国产精品福利电影一区二区三区四区| 亚洲最大的成人av| 肉色超薄丝袜脚交一区二区| 国产日本欧美在线| av免费观看一区二区| 久久伊伊香蕉| 国产情侣免费视频| 欧美一区二区日韩| 五月天激情国产综合婷婷婷| 欧美在线91| 懂色av粉嫩av蜜臀av一区二区三区| 日本丰满少妇xxxx| 高清毛片在线看| 亚洲美女啪啪| 999精彩视频| 国产成人免费av一区二区午夜| 成人一区二区三区视频| 91精品国产66| 91麻豆视频网站| 欧美亚洲系列| 中文在线视频观看| 欧美一区二区三区在线免费观看| 精品久久久久久久人人人人传媒| 日韩精品美女| 黄色aaa级片| 欧美一区二区三区在线电影| 亚洲欧美日韩国产综合精品二区| 91精品国产毛片武则天| 日韩精品一区国产麻豆| 欧美三级午夜理伦三级富婆| 韩国三级在线看| 蜜桃传媒九九九| 午夜影视日本亚洲欧洲精品| 秋霞欧美视频| 亚洲成a人片77777精品| 欧美成人精品在线观看| 成人做爰66片免费看网站| 中文字幕一区二区三区域| 欧美中文字幕在线观看视频| 免费欧美电影| 福利欧美精品在线| 一线天粉嫩在线播放| 蜜芽在线免费观看| 成人动漫一区二区在线| 福利视频久久| 日韩一区国产在线观看| 精品福利av| av免费在线观看不卡| 亚洲精品在线二区| 欧美激情在线免费| 国产成人一区二区在线观看| 成人嫩草影院| 色吊一区二区三区| 欧美男女交配视频| 黄色成人美女网站| www.久久久久.com| 天天免费综合色| 中日精品一色哟哟| 日韩美女在线看免费观看| 精品人妻一区二区三区换脸明星| 亚洲国产日韩成人综合天堂| 中文字幕一区二区视频| 日韩免费一区二区三区| 亚洲欧洲在线视频| 国产精品入口福利| 亚洲国产欧美一区二区丝袜黑人| 天天操夜夜操很很操| 欧美女优在线观看| 亚洲av熟女国产一区二区性色| 青青草97国产精品免费观看| 绯色av蜜臀vs少妇| 亚洲影视一区二区| 91视频亚洲| 日本精品www| 95影院理论片在线观看| zjzjzjzjzj亚洲女人| 超级白嫩亚洲国产第一| 国产成人精品视频ⅴa片软件竹菊| 污网站在线播放| 97久久精品午夜一区二区| 国产女人18毛片水真多| 制服诱惑一区二区| 天天插天天射| 69视频在线观看免费| 日本高清www免费视频| 亚洲精品一二三区区别| 精品黑人一区二区三区观看时间| 麻豆系列在线观看| 中日韩av在线| 国产精品白浆一区二小说| 中文字幕在线观看第一页| 国产亚洲欧美日韩美女| 国产精品视频导航| 综合久久国产九一剧情麻豆| 国产v综合v| 亚洲综合色视频| 国外av在线| 国产成人精品无码免费看夜聊软件| 欧美国产日产韩国视频| 成人性生交大片免费看视频直播| 欧美高清视频一区二区三区| 亚洲视频免费在线观看| 人妻少妇偷人精品久久久任期| 国产伦精一区二区三区| 美女久久网站| 久久久国产影院| 日韩福利在线观看| 午夜久久久久久久| av电影免费在线| 成人动漫免费在线观看| 欧洲伦理片一区 二区 三区| 国产黄色小视频在线| 激情欧美一区二区三区在线观看| 无码人妻精品一区二区三区不卡| 欧美日韩综合一区二区三区| 免费观看v片在线观看| 成人免费看片98| 亚洲精品女人久久久| 亚洲精品日韩专区silk| 无线免费在线视频| 亚洲区一区二区| 小荡货+程雪柔| 欧美成人精精品一区二区频| 久久影视精品| 国内成人自拍| 天天干天天色综合| 精品国产视频一区二区三区| 亚洲一区和二区| 久久久久久久久艹| 全国精品久久少妇| 日本道不卡免费一区| 国产精品一区在线看| 秋霞午夜一区二区| 精品粉嫩超白一线天av| 99久久免费精品| 亚洲在线观看视频网站| 欧美整片在线观看| 日本三级免费观看| 91网站免费观看| 久久精品国产网站| 香蕉久久夜色精品国产使用方法| 污视频网站在线看| 亚洲国产一区二区三区四区| 日韩中文欧美在线| 精品一区二区在线视频| 成人av在线资源网站| 日韩av片永久免费网站| 电影在线一区| 久久综合毛片| 我要看黄色一级片| 欧美性活一级视频| 中文在线√天堂| 欧美久久久久久久久久久| 国产精品18久久久久久麻辣| 国产精品一区二区av交换| 国产亚洲成av人片在线观看桃| 人人草人人干| 欧美成人国产va精品日本一级| 午夜国产精品影院在线观看| 欧美激情aⅴ一区二区三区| 久热精品在线观看视频| av中文字幕网址| 日韩在线一区二区三区免费视频| 国产黄a三级三级看三级| 91 视频免费观看| 黄网站免费在线播放| www.91popny.com| 先锋资源久久| 亚洲综合在线中文字幕| 国产精品毛片久久久久久久久久99999999| 中文在线一区二区| 亚洲午夜电影| 日韩美女在线视频| 亚洲区一区二区| 都市激情亚洲欧美| 国产美女性感在线观看懂色av| 精品视频免费看| 国产精品午夜久久| 日韩欧美国产wwwww| 黄色小视频在线免费看| 黄色91视频| 国产精品国产亚洲精品看不卡15| 黄色av一级片| 8av国产精品爽爽ⅴa在线观看| 最新亚洲精品| 欧美特黄一级| 2020国产精品视频| 国产精品视频第一区| 九色成人搞黄网站| 久久久久中文字幕2018| 国产精品你懂的在线| 影视先锋午夜av| 美腿丝袜亚洲一区| 成人a在线观看高清电影| 日韩欧美黄色动漫| 在线视频欧美性高潮| 九九热这里只有| 国产浪潮av性色av小说| 亚洲欧美福利一区二区| www.色精品| 久久国产精品免费一区二区三区| 原创真实夫妻啪啪av| 国产原创在线视频| 青青草久久伊人| 亚洲欧美一二三| 久久精品一区二区三区不卡牛牛| 丁香高清在线观看完整电影视频| 成人在线中文| 五月婷婷激情五月| 欧美大黑帍在线播放| 性色av蜜臀av浪潮av老女人| 日本高清不卡一区| 午夜影院免费观看视频| 天堂网在线中文| 波多野结衣一区二区三区四区| 国产九色porny| 91精品中国老女人| 日本一级黄视频| 国产精品丝袜xxxxxxx| 亚洲国产aⅴ精品一区二区三区| 92国产精品视频| 国产精品综合久久久| 日本三级一区二区三区| h网站视频在线观看| 亚洲天堂网中文字| 精品国产一二三区| 国产成人亚洲综合小说区| 久久久久久久久久久影视| 日韩在线观看一区| 国产美女视频免费看| 国产日产精品一区二区三区| 免费电影视频在线看| 国产成人三级视频| 中文 欧美 日韩| 久久理论电影| 国产一区 二区| 一本一道久久a久久精品逆3p| 九色自拍论坛| 超碰中文字幕在线| 无码人妻av一区二区三区波多野| 亚洲精品国精品久久99热一| 熟妇高潮一区二区| 国产精品剧情一区二区三区| 成人激情视频在线| 精品国产一区二区三区久久久蜜月| 91久久久久久久一区二区| 日本电影一区二区三区| 国产免费区一区二区三视频免费| 欧美主播福利视频| 亚洲精品www久久久久久| 成年人免费高清视频| 久久99久久人婷婷精品综合| 亚洲乱码一区二区| 中文字幕手机在线视频| 成人av在线播放观看| 亚洲精品国产a| 性感美女一区二区三区| 男女污污的视频| 国产熟女一区二区三区四区| 一区二区三区久久| 在线视频国产日韩| 日韩动漫在线观看| 国产精品海角社区在线观看| 少妇大叫太粗太大爽一区二区| 天天干天天操天天玩| 久久国内精品一国内精品| 亚洲美腿欧美偷拍| 无码人妻av免费一区二区三区| 丁香桃色午夜亚洲一区二区三区| 欧美毛片在线观看| 欧美天堂一区| 国产精品毛片a∨一区二区三区|国| 少妇高潮毛片色欲ava片| 91在线视频观看免费| 日本网站免费在线观看| 国模精品视频一区二区| 国产欧美一区二区精品性色超碰| 亚洲av无码乱码国产精品| 17videosex性欧美| 久久精品视频在线观看免费| 亚洲男人的天堂网站| 久久久久久久久97黄色工厂| 欧美国产精品v| 校园春色 亚洲色图| 99riav久久精品riav| 日韩精品一区二区亚洲av性色| www.日本三级| 久久九九久精品国产免费直播| 天天插天天色| 中文字幕在线视频第一页| 激情影院在线观看| 亚洲免费电影一区| 欧美成人tv| aⅴ在线免费观看| 免费黄网大全| 国产美女高潮视频|