網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
壓縮原理:找出那些重復(fù)出現(xiàn)的字符串,然后用更短的符號(hào)代替,達(dá)到縮短字符串的目的。
比如,一篇文章大量使用"#公眾號(hào)::iOS逆向"這個(gè)詞語(yǔ),我們用"iOS"代替,就縮短了6個(gè)字符,如果用"i"代替,就縮短了8個(gè)字符。
事實(shí)上,只要保證對(duì)應(yīng)關(guān)系,可以用任意字符代替那些重復(fù)出現(xiàn)的字符串。
本質(zhì)上,所謂"壓縮"就是找出文件內(nèi)容的概率分布,將那些出現(xiàn)概率高的部分代替成更短的形式。
所以,內(nèi)容越是重復(fù)的文件,就可以壓縮地越小。
比如,"ABABABABABABAB"可以壓縮成"7AB"。
I 圖片壓縮的兩種方式
- 質(zhì)量壓縮:即損失圖片的質(zhì)量為代價(jià),大小(長(zhǎng)寬尺寸)不變;
UIImageJPEGRepresentation(image, 0.0);//JPEG NSData * imageData = UIImagePNGRepresentation(image); ` //推薦使用png 因?yàn)閌PNG:0x89 image/png ,壓縮比沒(méi)有 JPG 高,但是無(wú)損壓縮,解壓縮性能高,蘋果推薦的圖像格式!
- 像素壓縮(比例壓縮):通過(guò)減少長(zhǎng)寬方向的像素?cái)?shù)量;
[sourceImage drawInRect:CGRectMake(0,0,targetWidth, targetHeight)] ;
本文的壓縮方案:質(zhì)量壓縮(0.5) 結(jié)合比例壓縮(1028):
1、質(zhì)量壓縮的比例(質(zhì)量壓縮使用系統(tǒng)APIUIImageJPEGRepresentation) 2、比例壓縮使用:drawInRect
II、 解決壓縮之后圖片模糊的問(wèn)題
模糊的問(wèn)題的大部分原因:使用第三方框架,(比如QMUIKit),在選擇相冊(cè)預(yù)覽的時(shí)候,就把圖片壓縮了很模糊了。
應(yīng)用場(chǎng)景:針對(duì)協(xié)議類型這種大圖
2.1、如果是拍照,可以壓縮一下分辨率,否則上傳很慢
不用使用預(yù)覽圖進(jìn)行上傳
// [self imgUpLoad:imageAsset.previewImage Max:1 Index:1]; [self imgUpLoad:imageAsset.originImage Max:1 Index:1];
如果是拍照,可以壓縮一下分辨率,否則上傳很慢
return [self imageCompressForSize:image targetSize:size];
拍照壓縮分辨率的例子
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSString *type = [info objectForKey:UIImagePickerControllerMediaType]; //當(dāng)選擇的類型是圖片 if ([type isEqualToString:@"public.image"]) { UIImage *image1 = [info objectForKey:UIImagePickerControllerOriginalImage]; image1 = [ControlManager image:image1 scaleToSize:CGSizeMake(1000, 1200)];// 壓縮分辨率 便于上傳 [picker dismissViewControllerAnimated:YES completion:nil]; [SVProgressHUD showWithStatus:@"上傳中.." maskType:SVProgressHUDMaskTypeGradient]; [self imgUpLoad:image1 Max:1 Index:1]; } }
2.2、 質(zhì)量壓縮(0.5) 結(jié)合比例壓縮(1028)
用法
NSData * imageData = UIImageJPEGRepresentation( [image compressWithTargetPixel:1028], k_UIImageJPEGRepresentationcompressionQuality);
質(zhì)量壓縮的比例
(質(zhì)量壓縮使用系統(tǒng)APIUIImageJPEGRepresentation
)
#define k_UIImageJPEGRepresentationcompressionQuality 0.5
比例壓縮的代碼
- (UIImage *)compressWithTargetPixel:(NSUInteger)targetPx { }
III 針對(duì)業(yè)務(wù)場(chǎng)景選擇圖片格式
3.1 如何區(qū)分不同格式的圖像的
- 根據(jù)圖像數(shù)據(jù)第一個(gè)字節(jié)來(lái)判斷的!
?// NSData+ImageContentType.m ? ?+ (NSString *)sd_contentTypeForImageData:
?PNG:0x89 image/png ,壓縮比沒(méi)有 JPG 高,但是無(wú)損壓縮,解壓縮性能高,蘋果推薦的圖像格式!
?JPG:0xFF image/jpeg,壓縮比最高的一種圖片格式,有損壓縮!最多使用的場(chǎng)景,照相機(jī)!解壓縮的性能不好!
?GIF:0x47 image/gif ,序列楨動(dòng)圖,特點(diǎn):只支持 256 種顏色!最流行的時(shí)候在 1998~1999,有專利的!?
3.2 使用場(chǎng)景分析
3.2.1 JPEG/JPG
- 特點(diǎn):有損壓縮、體積小、不支持透明
- 使用場(chǎng)景:顏色豐富的照片,JPG是通用的選擇,如大的背景圖、輪播圖或Banner圖。
3.2.2 PNG
- 特點(diǎn):無(wú)損壓縮、質(zhì)量高、體積大、支持透明。
- 使用場(chǎng)景:透明圖片的業(yè)務(wù)場(chǎng)景,如小的Logo、顏色簡(jiǎn)單且對(duì)比強(qiáng)烈的圖片或背景。
3.2.3 SVG
- 特點(diǎn):文本文件、體積小、不失真、兼容性好、無(wú)需多端、多分辨率適配、較強(qiáng)的交互特性、渲染成本比較高。
- 使用場(chǎng)景:圖片色彩相對(duì)簡(jiǎn)單的業(yè)務(wù)場(chǎng)景。
3.2.4 Base64
- 特點(diǎn):文本文件、依賴編碼,Base64編碼后,圖片大小會(huì)膨脹為原文件的4/3。
- 使用場(chǎng)景:小圖標(biāo)(<8KB)解決方案。
3.2.5 WebP
- 特點(diǎn):WebP圖片是一種新的圖像格式,由Google開(kāi)發(fā)。與png、jpg相比,相同的視覺(jué)體驗(yàn)下,WebP圖像的尺寸縮小了大約30%。另外,WebP圖像格式還支持有損壓縮、無(wú)損壓縮、透明和動(dòng)畫,但有兼容性問(wèn)題。
- 使用場(chǎng)景:圖片占較大的商場(chǎng)類網(wǎng)站,目前Google、Facebook、ebay、淘寶、騰訊、美團(tuán)等已經(jīng)在用。
“打開(kāi)淘寶網(wǎng),假如你是chrome瀏覽器,你會(huì)發(fā)現(xiàn),所有圖片都是webp結(jié)尾的,淘寶網(wǎng)圖片運(yùn)用了webp。假如你是safari瀏覽器,看到圖片就是jpg或者png了,淘寶網(wǎng)自動(dòng)判斷瀏覽器支持不支持webp,假如支持,則輸出相應(yīng)的圖片格式!
原文鏈接:https://juejin.cn/post/7001377497803653127
相關(guān)推薦
- 2022-03-31 C語(yǔ)言取模取整的深入理解_C 語(yǔ)言
- 2022-11-01 python一行輸入多值的實(shí)現(xiàn)詳解_python
- 2022-04-30 詳解DataGridView控件的數(shù)據(jù)綁定_C#教程
- 2024-02-16 SpringBoot 事務(wù)管理Transactional 數(shù)據(jù)回滾 數(shù)據(jù)一致性
- 2022-01-12 2022年了--你還不會(huì)手寫promise? --_-- promise的實(shí)現(xiàn) 第一版
- 2023-09-12 git常用指令
- 2022-10-04 正則表達(dá)式中關(guān)于對(duì)原生字符串的簡(jiǎn)單理解_正則表達(dá)式
- 2023-11-11 tensorflow分布式報(bào)錯(cuò):tensorflow.python.framework.errors
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支