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

首頁 > 系統 > iOS > 正文

iOS中大尺寸圖片的旋轉與縮放實例詳解

2019-10-21 18:39:51
字體:
來源:轉載
供稿:網友

前言

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

可即使是如此,也不代表一個應用可使用的空間是2G。

一張10000 x 10000的圖片,如果通過UIImageJPEGRepresentation方法將圖片轉成內存數據,會有一個峰值波動。

這里的峰值其實是圖片在解壓時產生的位圖數據所占空間,然后才轉換成我們可以操作的NSData。

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

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

本文將給大家詳細介紹關于iOS大尺寸圖片旋轉縮放的相關內容,分享出來供大家參考學習,話不多說了,接下來說下具體的操作

旋轉

我們知道如果對一個UIImage對象進行旋轉操作,相信做項目時肯定會有用到 UIImage 這個類,可以有如下的方式

通過 CGContextDrawImage 進行圖片繪制

+ (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;} 

這里有一個問題是,這里會創建一個新的圖片大小空間的,然后進行重新繪制。可能會存在一個隱患,就是當圖片尺寸過大的時候,就會出現內存占用過高的情況

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

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

這其中就有我們需要的濾鏡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"]; //根據濾鏡設置圖片 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; } //進行形變 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來進行圖片操作,可以一定程度的降低消耗,節約資源。

縮放

既然圖片很大,那么我們可以通過縮放的方式,來減小圖片的尺寸,減少內存消耗,進而降低異常風險。

我們通常采用UIImage提供的系統方法drawInRect 及其一系列的方法,來進行圖片縮放。

可是這種操作的缺陷和最開始介紹的旋轉一樣,其實質都是進行圖片的重新繪制。

通過繪制圖片的方式進行圖片縮放

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

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

iOS,大尺寸圖片,旋轉,縮放

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

先看下內存消耗

iOS,大尺寸圖片,旋轉,縮放

通過圖上可以看出,在進行圖片縮放的時候,內存有小幅增加,產生的消耗在18M,耗時也在1.5s左右。

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

+(UIImage *)resizeImage:(UIImage *)image toSize:(CGSize)size { CIImage *ciImage = [[CIImage alloc] initWithImage:image]; //創建一個input image類型的濾鏡 CIFilter *filter = [CIFilter filterWithName:@"CIAffineTransform" keysAndValues:kCIInputImageKey, ciImage, nil]; //設置默認的濾鏡效果 [filter setDefaults]; //設置縮放比例 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; } //進行賦值 CGAffineTransform transform = CGAffineTransformMakeScale(scale, scale); [filter setValue:[NSValue valueWithBytes:&transform objCType:@encode(CGAffineTransform)] forKey:@"inputTransform"]; //通過GPU的方式來進行處理 CIContext *context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(NO)}]; //根據濾鏡輸出圖片 CIImage *outputImage = [filter outputImage]; CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]]; //創建UIImage 對象,并釋放資源 UIImage *result = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); return result;}

可以發現我們這里使用的和旋轉是同樣的方式。通過給圖片添加濾鏡能夠很安全的實現我們的需求。

總結

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

2.通過CoreImage.framework來進行圖片處理。

3.之前一直對CoreImage.framework的理解,只是其能夠對圖片和視頻添加那種可見的濾鏡,未曾想過這種濾鏡也支持縮放和旋轉。

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

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

可以自由在CPU和GPU之間切換運算方式,

可以最大限度的利用GPU來進行計算,降低內存消耗,

甚至可以對視頻進行實時濾鏡處理。

針對不能通過原生對UIView進行transform操作的時候,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.

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

代碼地址

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人网页在线免费观看| 亚洲淫片在线视频| 成人精品一区二区三区电影免费| 亚洲福利在线看| 久久久久久久影视| 久久久免费在线观看| 国产欧美一区二区三区视频| 国产精品久久久久久久久久久久久| 久久人人爽亚洲精品天堂| 尤物yw午夜国产精品视频明星| 国产亚洲精品va在线观看| 色偷偷88888欧美精品久久久| 亚洲第一精品福利| 欧美电影免费观看高清完整| 精品视频在线观看日韩| 日本精品一区二区三区在线| 日韩男女性生活视频| 九九热这里只有精品6| 欧美xxxwww| 国产日本欧美一区二区三区在线| 国产成人黄色av| 91精品国产91久久久久久| 一区二区三区无码高清视频| 欧美激情xxxx| 亚洲精品狠狠操| 91精品国产91久久久久久最新| 国产成人精品久久二区二区91| 国产一区二区三区毛片| 国产欧美亚洲视频| 中文字幕日韩免费视频| 亚洲欧美中文字幕在线一区| 日韩av在线精品| 91热精品视频| 正在播放欧美一区| 岛国精品视频在线播放| 国产精品99久久久久久白浆小说| 成人国产在线激情| 亚洲第一区在线观看| 国产精品91免费在线| 国产精品自拍偷拍| 国产精品成人一区二区三区吃奶| 日本韩国欧美精品大片卡二| 欧美日韩国产色| 97在线视频国产| 亚洲电影免费在线观看| 久久久综合av| 日韩在线免费av| 亚洲丝袜在线视频| 成人精品久久久| 久久免费视频这里只有精品| 一区二区三区www| 成人国产亚洲精品a区天堂华泰| 中文字幕日韩免费视频| 久久大大胆人体| 韩国19禁主播vip福利视频| 亚洲一区中文字幕在线观看| 精品国产欧美一区二区五十路| 羞羞色国产精品| 国产91久久婷婷一区二区| 成人av番号网| 国产成人精品最新| 38少妇精品导航| 国模精品系列视频| 欧美午夜激情视频| 国内免费久久久久久久久久久| 亚洲网站在线播放| 丝袜一区二区三区| 日本久久亚洲电影| 91成人天堂久久成人| 亚洲影院高清在线| 亚洲成人a**站| 国产亚洲精品久久久久动| 在线观看亚洲视频| 2019中文字幕全在线观看| 日本久久久久久| 中文字幕国内精品| 国产手机视频精品| 成人国产亚洲精品a区天堂华泰| 久久久久久国产精品久久| 久久韩国免费视频| 欧亚精品在线观看| 岛国av一区二区在线在线观看| 欧美日韩国内自拍| 91精品国产自产在线老师啪| 成人免费xxxxx在线观看| 97成人在线视频| 日韩毛片在线看| 欧美性xxxxx极品娇小| 国产精品天天狠天天看| 色悠久久久久综合先锋影音下载| 精品香蕉一区二区三区| 精品网站999www| 国产a∨精品一区二区三区不卡| 国产成一区二区| 欧美福利视频在线观看| 国产精品久久久久久久7电影| 亚洲激情视频网| 久久精品亚洲热| 81精品国产乱码久久久久久| 97国产成人精品视频| 亚洲电影免费观看| 成人免费淫片视频软件| 日韩成人激情视频| 日韩精品在线第一页| 欧美国产日韩在线| 亚洲精品国产精品自产a区红杏吧| 在线成人免费网站| 欧美三级欧美成人高清www| 日韩视频在线免费观看| 亚洲另类xxxx| 91在线免费看网站| 亚洲最大成人在线| 日韩av理论片| 国产69久久精品成人看| 永久555www成人免费| 国产综合色香蕉精品| 91久久久久久久久久久久久| 欧美激情高清视频| 精品国内产的精品视频在线观看| 亚洲最大成人网色| 国产日产久久高清欧美一区| 在线视频欧美性高潮| 欧美xxxwww| 亚洲xxxx妇黄裸体| 国产成人精品一区二区在线| 91丨九色丨国产在线| 亚洲图中文字幕| 欧美精品制服第一页| 欧美老肥婆性猛交视频| 欧美电影免费在线观看| 精品一区二区三区四区| 欧美国产日韩一区二区在线观看| 国产一区二区日韩精品欧美精品| 青青草原成人在线视频| 久久精品免费播放| 久久高清视频免费| 亚洲一区二区久久久久久久| 日本久久久久久久| 在线激情影院一区| 国产ts人妖一区二区三区| 欧美自拍视频在线| 亚洲石原莉奈一区二区在线观看| 国产裸体写真av一区二区| 伊人伊成久久人综合网小说| 国产午夜精品视频免费不卡69堂| 岛国视频午夜一区免费在线观看| 亚洲天天在线日亚洲洲精| 久久久国产精品x99av| 欧美精品999| 国产精品吹潮在线观看| 国产精品日韩专区| 国产精品一区二区性色av| 欧美巨大黑人极品精男| 美女少妇精品视频| 成人激情在线观看| 日韩成人激情视频| 亚洲欧美国产精品| 中文字幕欧美精品在线| 欧美午夜视频在线观看| 国产精品露脸自拍| 欧美成人一区二区三区电影| 欧美成年人视频| 成人免费午夜电影| 亚洲福利视频网|