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

首頁 > 系統 > iOS > 正文

iOS圖片壓縮、濾鏡、剪切及渲染等詳解

2020-07-26 02:21:31
字體:
來源:轉載
供稿:網友

前言

本文主要給大家介紹了關于iOS圖片壓縮、濾鏡、剪切及渲染的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧

主要內容:

1、圖片基礎知識的介紹

2、圖片壓縮

  • 簡單的回顧一下從相冊獲取一張圖片
  • 直接格式轉換壓縮:png、jpg、Context 重新繪制

3、圖片處理

  • 基于圖片像素修改
  • 圖片剪切clip
  • 渲染render
  • 截屏

一、圖片基礎知識的介紹

一張圖像是像素點的集合,每一個像素都是一個獨立,有自己的顏色。圖像一般情況下都存儲成數組,可以說是二維數組。當成百上千萬個像素集合一起后,就構成了圖像。表示圖形的方式很多種YUV,RGBA,最簡單的:32位RGBA模式。將一個顏色的值存儲在32位中(或4個字節) 每個字節存儲一個顏色通道(RGBA)。

二、圖片壓縮

2.1、簡單的回顧一下從相冊獲取一張圖片

<1>、說到系統的圖片,離不開相冊與相機,要能使真機在使用時成功調用相冊/拍照功能,那么我們需要在info.plist類里面設置兩個key:Privacy - Camera Usage Description與Privacy - Photo Library Usage Description,在測試的時候根據崩潰添加更好


相機與相冊的key

<2>、掛兩個代理:<UIImagePickerControllerDelegate,UINavigationControllerDelegate>

<3>、定義兩個button,相冊的tag值 101,相機102,調用UIImagePickerController

#pragma mark 選擇相冊-(void)selectImage:(UIButton *)sender{ NSInteger tag = sender.tag - 100; NSUInteger sourceType = 0; if (tag == 1) { // 相冊 // 1.判斷能否打開照片庫(不支持直接返回) if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) return; sourceType = UIImagePickerControllerSourceTypePhotoLibrary; }else if (tag == 2){ // 拍照 // 2.判斷支不支持相機(不支持直接返回) if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) return; sourceType = UIImagePickerControllerSourceTypeCamera; } UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; //設置代理 imagePickerController.delegate = self; // imagePickerController.allowsEditing = YES; imagePickerController.sourceType = sourceType; [self presentViewController:imagePickerController animated:YES completion:nil];}

<4>、UIImagePickerController代理方法的實現(暫且去掉剪輯圖片)

#pragma mark - UIImagePicker delegate- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{ NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType]; // 獲取到的圖片 if ([mediaType isEqualToString:@"public.image"]) { UIImage * image; // 判斷,圖片是否允許修改 // if ([picker allowsEditing]){  //獲取用戶編輯之后的圖像  // image = [info objectForKey:UIImagePickerControllerEditedImage]; // } else {  // 照片的元數據參數  image = [info objectForKey:UIImagePickerControllerOriginalImage]; // } // 壓縮圖片(處理) 看下面 } [self dismissViewControllerAnimated:YES completion:NULL];}// 當用戶取消選擇的時候,調用該方法- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{ NSLog(@"取消相冊使用 --- %s", __func__); [self dismissViewControllerAnimated:YES completion:nil];}

<4>、 計算  NSData 的大小

#pragma mark 計算 NSData 的大小- (NSString*)length:(NSInteger)length{ if (length > 1024 * 1024) { int mb = (int)length/(1024*1024); int kb = (length%(1024*1024))/1024; return [NSString stringWithFormat:@"%dMb%dKB",mb, kb]; }else{ return [NSString stringWithFormat:@"%ldKB",length/1024]; }}

2.2、在上面我們已經拿到圖片了,那么下面我們隊圖片的壓縮進行下處理

<1>:png 壓縮

// 壓縮圖片NSData *dataPNG = UIImagePNGRepresentation(image);UIImage *compressPNGImage = [UIImage imageWithData:dataPNG];NSLog(@"%@",[self length:dataPNG.length]);

提示:

  • 這種壓縮方式會出現內存飆升
  • 文件屬性格式并不會壓縮,壓縮的是圖片內容(像素)

<2>:jpg 壓縮

/** 第一個參數:UIIMage 對象 第二個參數:圖片質量(壓縮系數)0~1 之間 */NSData *dataJPG = UIImageJPEGRepresentation(image, 0.1);UIImage *compressJPGImage = [UIImage imageWithData:dataJPG];NSLog(@"%@",[self length:dataJPG.length]);

提示:

1.如果是通過JPEG來壓縮圖片, 圖片壓縮之后是不保真的

2.蘋果官方不推薦我們使用JPG圖片,因為現實JPG圖片的時候解壓縮非常消耗性能

3.這種壓縮方式雖然可以通過設置圖片質量,但是也會出現內存飆升

<3>:自定義 size 壓縮通過 上下文 來壓縮圖片

UIImage *compressImg = [self compressOriginalImage:image withImageSize:CGSizeMake(200, 200)];NSLog(@"%@",NSStringFromCGSize(compressImg.size)); // 壓縮圖片- (UIImage *)compressOriginalImage:(UIImage *)originalImage withImageSize:(CGSize)size{ // 開啟圖片上下文 UIGraphicsBeginImageContext(size); // 將圖片渲染到圖片上下文 [originalImage drawInRect:CGRectMake(0, 0, size.width, size.height)]; // 獲取圖片 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); // 關閉圖片上下文 UIGraphicsEndImageContext(); return newImage;}

提示:這種方式解決了內存的飆升,算是一種好的壓縮方式

<4>:注意:一般情況下,只要涉及到從相冊中獲取圖片的功能, 都需要處理內存,一般情況下一個應用程序啟動會占用20M左右的內存, 當內存飆升到500M左右的時候系統就會發送內存警告, 此時就需要釋放內存 , 否則就會閃退,只要內存釋放到100M左右, 那么系統就不會閃退我們的應用程序,也就是說一個應用程序占用的內存20~100時是比較安全的內容范圍。

三、圖片處理

3.1、基于圖片像素修改

<1>、過濾圖片:涉及到圖片的像素處理,也是根據上下文進行操作的,進行一個繪制;從圖片文件把 圖片數據的像素拿出來(RGBA), 對像素進行操作, 進行一個轉換(Bitmap (GPU))
修改完之后,還原(圖片的屬性 RGBA,RGBA (寬度,高度,色值空間,拿到寬度和高度,每一個畫多少個像素,畫多少行))


過濾圖片

-(void)filterImage{ CGImageRef imageRef = self.imageView1.image.CGImage; // 1 個字節 = 8bit 每行有 17152 每行有17152*8 位 size_t width = CGImageGetWidth(imageRef); size_t height = CGImageGetHeight(imageRef); size_t bits = CGImageGetBitsPerComponent(imageRef); // 8 size_t bitsPerrow = CGImageGetBytesPerRow(imageRef); // width * bits // 顏色空間 CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef); // AlphaInfo: RGBA AGBR RGB :AlphaInfo 信息 CGImageAlphaInfo alpInfo = CGImageGetAlphaInfo(imageRef); // bitmap的數據 CGDataProviderRef providerRef = CGImageGetDataProvider(imageRef); CFDataRef bitmapData = CGDataProviderCopyData(providerRef); NSInteger pixLength = CFDataGetLength(bitmapData); // 像素byte數組 Byte *pixbuf = CFDataGetMutableBytePtr((CFMutableDataRef)bitmapData); // RGBA 為一個單元 for (int i = 0; i < pixLength; i+=4) {  [self eocImageFiletPixBuf:pixbuf offset:i]; } // 準備繪制圖片了 // bitmap 生成一個上下文 再通過上下文生成圖片 CGContextRef contextR = CGBitmapContextCreate(pixbuf, width, height, bits, bitsPerrow, colorSpace, alpInfo); CGImageRef filterImageRef = CGBitmapContextCreateImage(contextR); UIImage *filterImage = [UIImage imageWithCGImage:filterImageRef]; self.imageView1.image = filterImage;}// RGBA 為一個單元 彩色照變黑白照- (void)eocImageFiletPixBuf:(Byte*)pixBuf offset:(int)offset{ int offsetR = offset; int offsetG = offset + 1; int offsetB = offset + 2; // int offsetA = offset + 3; int red = pixBuf[offsetR]; int gre = pixBuf[offsetG]; int blu = pixBuf[offsetB]; // int alp = pixBuf[offsetA]; int gray = (red + gre + blu)/3; pixBuf[offsetR] = gray; pixBuf[offsetG] = gray; pixBuf[offsetB] = gray;}

<2>、還原圖片:這個其實沒什么講的,只要把過濾前的圖片的UIIMage進行保存,再次賦值就好

3.2、圖片剪切clip


圖片剪切clip

<1>、規則圖片剪切(圓形,矩形等)

#pragma mark 剪切圖片(規則的剪切圖)-(void)clipImage{ CGSize size = CGSizeMake(100, 100); // 開啟上下文 UIGraphicsBeginImageContext(size); // 獲取當前的上下文 CGContextRef context = UIGraphicsGetCurrentContext(); // 設置路徑剪切(設置一個圓) CGRect rect = CGRectMake(0, 0, size.width, size.height); CGContextAddEllipseInRect(context, rect); CGContextClip(context); // 把圖片繪制上去 [self.oriImage drawInRect:CGRectMake(0, 0, size.width, size.height)]; UIImage *clipImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // 把剪切過的圖片展示出來  self.imageView2.image = clipImage;}

<2>、不規則圖片剪切(根據自定義path剪切)

#pragma mark 剪切圖片(不規則的剪切圖)-(void)irRegularclipImage{ UIGraphicsBeginImageContext(CGSizeMake(200, 200)); CGContextRef context = UIGraphicsGetCurrentContext(); // 非規則的path CGMutablePathRef pathRef = CGPathCreateMutable(); CGPoint lines[] = {  CGPointMake(50,0),  CGPointMake(100,0),  CGPointMake(150,80),  CGPointMake(0,80),  CGPointMake(50,0) }; CGPathAddLines(pathRef, NULL, lines, 5); CGContextAddPath(context, pathRef); CGContextClip(context); [self.oriImage drawInRect:CGRectMake(0, 0, 200, 200)]; UIImage *clipImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();  // 把剪切過的圖片展示出來  self.imageView3.image = clipImage;}

3.3、圖片渲染

#pragma mark 在圖片上渲染一層半透明的紅色-(void)blend{ // 原圖的大小 CGSize size = CGSizeMake(self.imageView1.frame.size.width, self.imageView1.frame.size.height); UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); [self.oriImage drawInRect:CGRectMake(0, 0, size.width, size.height)]; // 設置半透明紅色的渲染 UIColor *redColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:0.5]; CGContextSetFillColorWithColor(context, redColor.CGColor); CGContextSetBlendMode(context, kCGBlendModeNormal); CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height)); // 獲取渲染的CGImageRef CGImageRef imageRef = CGBitmapContextCreateImage(context); self.imageView1.image = [UIImage imageWithCGImage:imageRef]; UIGraphicsEndImageContext();}

3.4、截屏(截取一個對象上的所有視圖),我們以截取self.view的視圖為例


截屏**(截取一個對象上的所有視圖),我們以截取self.view的視圖為例

<1>、截屏方式一

- (UIImage *)jk_snapshotImage { UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0); [self.view drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES]; UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return result;}

<2>、截屏方式一

- (UIImage *)imageFromFullView{ UIGraphicsBeginImageContext(self.view.frame.size); CGContextRef context = UIGraphicsGetCurrentContext(); [self.view.layer renderInContext:context]; CGImageRef imageRef = CGBitmapContextCreateImage(context); UIImage *newImage = [UIImage imageWithCGImage:imageRef]; UIGraphicsEndImageContext(); return newImage;}

此篇博客的 demo (本地下載)

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91国产视频在线| 久久久电影免费观看完整版| 欧美视频专区一二在线观看| 91精品国产成人www| 成人精品在线观看| 97av在线视频| 亚洲综合视频1区| 欧美大人香蕉在线| 成人福利免费观看| 久久精品国产96久久久香蕉| 亚洲精品日韩久久久| 亚洲一区制服诱惑| 疯狂蹂躏欧美一区二区精品| …久久精品99久久香蕉国产| 成人美女免费网站视频| 日韩av在线免费观看一区| 欧美在线免费看| 国产精品日韩av| 亚洲欧美制服中文字幕| 日韩免费看的电影电视剧大全| 川上优av一区二区线观看| 久久免费国产精品1| 国产欧美一区二区三区视频| 日本久久久久久| 欧美体内谢she精2性欧美| 国产一区二区丝袜高跟鞋图片| 中文字幕精品影院| 日韩av片永久免费网站| 国产成人一区三区| 国产免费一区视频观看免费| 亚洲精品日韩av| 91精品国产免费久久久久久| 成人免费福利视频| 欧美激情性做爰免费视频| 亚洲精品国产suv| 亚洲欧美日韩国产精品| 最好看的2019的中文字幕视频| 欧美性猛交xxxx偷拍洗澡| 国内精品视频一区| 亚洲日本欧美中文幕| 精品久久久久久| 久久夜色撩人精品| 亚洲激情在线观看视频免费| 亚洲精品福利在线| 九九热精品视频国产| www.欧美视频| 91午夜在线播放| 91网在线免费观看| 青草青草久热精品视频在线网站| 日韩电影中文字幕av| 欧美精品成人在线| 亚洲日本欧美中文幕| 亚洲精品www久久久| 国产亚洲欧洲在线| 免费97视频在线精品国自产拍| 亚洲人成网站777色婷婷| 欧美极品美女视频网站在线观看免费| 黄色91在线观看| 日韩在线一区二区三区免费视频| 国产一区二区精品丝袜| 久久免费国产视频| 国产精品美女在线观看| 成人黄色片在线| 亚洲国产精品va在线| 国产亚洲成精品久久| 亚洲成av人片在线观看香蕉| 久久这里有精品| 久久久在线免费观看| 欧美一级在线播放| 久久影视电视剧凤归四时歌| 日韩精品视频在线免费观看| 亚洲人成在线免费观看| 91精品国产色综合久久不卡98| 久久乐国产精品| 91av在线不卡| 中文字幕欧美精品日韩中文字幕| 91久久精品在线| 欧美二区在线播放| 中文字幕国产精品| 亚洲欧美在线看| 日韩精品999| 一个人看的www久久| 日韩在线视频二区| 欧美特黄级在线| 91精品久久久久久| 精品动漫一区二区三区| 黑人巨大精品欧美一区二区免费| 久久免费精品日本久久中文字幕| 高清欧美性猛交xxxx| 77777亚洲午夜久久多人| 国产精品久久久久久久9999| 欧美激情在线一区| 清纯唯美日韩制服另类| 97在线视频观看| 欧美一区第一页| 精品久久久视频| 亚洲老板91色精品久久| 欧美成人h版在线观看| 高清欧美性猛交| 国产91免费观看| 精品露脸国产偷人在视频| www.欧美三级电影.com| 18一19gay欧美视频网站| 欧美日韩裸体免费视频| 日韩成人在线电影网| 欧美肥臀大乳一区二区免费视频| 亚洲最大成人网色| 日韩视频欧美视频| 久久久久久美女| 欧美日产国产成人免费图片| 亚洲精品视频网上网址在线观看| 国产成人在线一区二区| 中文字幕一区日韩电影| 久久久精品一区二区三区| 亚洲大尺度美女在线| www高清在线视频日韩欧美| 国产精品一区二区久久| 亚洲国产精品嫩草影院久久| 成人午夜激情免费视频| 国产免费一区二区三区在线能观看| 成人在线播放av| 亚洲片国产一区一级在线观看| 秋霞成人午夜鲁丝一区二区三区| 国产精品白丝av嫩草影院| 日韩av色综合| 韩国19禁主播vip福利视频| 欧美亚洲视频在线看网址| 中文字幕欧美日韩va免费视频| 国产日韩欧美影视| 国产精品精品久久久久久| 亚洲欧美精品中文字幕在线| 国产网站欧美日韩免费精品在线观看| 精品日韩视频在线观看| 色先锋久久影院av| 中文字幕久久久av一区| 一区二区三区四区精品| 精品视频在线观看日韩| 欧美电影第一页| 中国人与牲禽动交精品| 欧美亚洲一级片| 国产精品观看在线亚洲人成网| 欧美午夜精品伦理| 中文字幕精品一区久久久久| 深夜精品寂寞黄网站在线观看| 亚洲成人精品在线| 亚洲第一区中文字幕| 精品国产91久久久| 欧美xxxx做受欧美| 亚洲国产私拍精品国模在线观看| 91天堂在线观看| 精品亚洲男同gayvideo网站| 亚洲自拍偷拍第一页| 国产精品综合网站| 亚洲www在线观看| 亚洲精品资源美女情侣酒店| 98视频在线噜噜噜国产| 亚洲精品v欧美精品v日韩精品| 亚洲自拍中文字幕| 亚洲男人天堂古典| 欧美国产日韩一区二区| 国产精品美女主播在线观看纯欲| 国产精品福利在线观看| 色狠狠久久aa北条麻妃| 欧美日韩激情视频|