精华内容
下载资源
问答
  • 虽然我们经常使用压缩文件,但不一定真正了解,数据压缩的原理和不同压缩文件格式的区别。一、压缩原理压缩分为“有损压缩”和“无损压缩”。有损压缩就是直接对文件进行压缩,删除不重要的数据,一般用于音乐、视频...

    e4a99d36d77d9245966ee4c56402a85d.png

    大家应该都用过文件压缩包这个东西,通过打包压缩,可以减少文件体积,对文件加密,绕过一些网络传输规则。虽然我们经常使用压缩文件,但不一定真正了解,数据压缩的原理和不同压缩文件格式的区别。

    5bf9f5671b3842e876d0c6dba911af97.png

    一、压缩原理

    压缩分为“有损压缩”和“无损压缩”。

    有损压缩就是直接对文件进行压缩,删除不重要的数据,一般用于音乐、视频、图像等媒体文件。有损压缩后不能还原,比如在微信上传图片未勾选“原图”时,就会被有损压缩。

    无损压缩,数据可以被完美还原。简单来说所有文件都是由代码组成的,代码数量决定了文件体积,但是,文件体积与文件包含的有效信息量却并不对等。因为文件中的代码并不是最精简的状态,如果将这些代码精简,就能在文件内容不变的情况下缩小文件体积。所有压缩软件的工作原理都是这样,只是不同格式的算法不同。

    举个不太恰当的例子:①我家门前有两棵树,一棵是枣树,另一颗也是枣树;②我家门前两枣树。前面这两句话传达的信息是一样的。而解压文件的过程也就是将精简的内容还原,比如 N*8 还原成 NNNNNNNN。综上所述,如果压缩率高,自然要进行的运算量也就更大,压缩和解压也就更花时间。

    二、格式区别

    目前主流的压缩文件格式大致有三种,分别是:ZIP、RAR和7Z,它们分别来自:Winzip、Winrar以及7-Zip。

    1、ZIP格式

    ZIP应该算是最常见的压缩文件格式了,诞生于 1986 年,它的压缩率在众多压缩格式中只能算平庸,但因为它是开放免费的格式,所以在那个没有太多压缩方式可选的年代很快流行起来。现在,你甚至不需要单独为它安装一个压缩或者解压缩软件,因为我们使用的Windows10系统或MacOS系统都集成了对ZIP文件的支持,而不需要安装第三方解压工具,同时,几乎所有的压缩软件都会提供对ZIP文件的支持,不用担心格式不兼容的问题,这些足以体现出ZIP格式的地位。

    ZIP时代最出名的压缩软件就要数WinZIP了,它几乎是当时每台电脑都必备的软件,直到Windows10系统开始集成了对ZIP文件的支持,以及后起新秀RAR格式的出现,使得WinZIP不再是那么的必要,才让它逐渐退出了大家的视线。

    2、RAR格式

    如果你对比过的话会发现 rar 格式的压缩率通常高于 zip,但你大概不知道这是一个专利文件格式,只有收费软件WinRAR可以创建rar格式的压缩文件,但其他压缩软件可以解压 rar 文件。

    rar 可以说各方面都强于 zip,这也是它作为收费软件能活下来的原因。当年电脑刚刚开始普及的时候,软盘容量很小,网络传输速率又慢,压缩率更高的 rar 自然成了广大网友分享资源的首选,下载站为了节约带宽成本,也都使用 rar。加上WinRAR 在国内基本“免费”的原因,所以 rar 压缩格式在国内还是主流压缩格式,rar 在国外市场的占比就要少很多。

    对RAR文件进行压缩或者解压缩,首选的软件当然是WinRAR,与之前的WinZIP一样,它几乎也是现在每台电脑都必装的软件。不过,作为商业软件,WinRAR只允许用户进行30天的免费试用,虽然过期后软件仍然能够正常工作,但就已经不再合法了。

    3、7Z格式

    另外你可能还见过 7z 格式,这是开源软件 7-Zip 的开源压缩格式,和 zip 一样,主流的软件都能打开或创建 7z 格式的文件。作为压缩格式中的后起之秀,7z 的压缩率甚至比收费的 rar 还要高,但是它诞生在 rar 已经普及的年代,并没有乘上互联网普及的的东风,所以也难以取代 rar 和 zip 的地位。

    为了实现高压缩率,7z 使用了包括报头压缩在内的各种奇淫巧计。也正是由于这些功能,当 7z 压缩文件受到一点轻微损坏,就几乎不可能恢复它。

    三、安全性问题

    zip和rar都可设密码保护,但是rar安全性更强。由于zip广泛被使用并且代码开源的原因,压缩文件被暴力破解是常有的事情。而对于zip密码来说“明文攻击”更是致命的。如果了解到被加密压缩zip文件的某段内容就可以反推zip加密口令。

    而rar的出现就很好的弥补了zip的安全性问题,它采用的是目前公认的安全系数很高的AES对称加密算法,密码长度可达128位字符。即便你跑字典暴力破解搞到天荒地老也很难解开。

    综上而言,如果你是出于他人方便或者是减少压缩和解压时间则采用zip方式,若你是出于安全性方面考虑或者追求高压缩率则选择rar!


    本文转载:哪种压缩格式最好?文件压缩格式rar、zip、7z有什么区别? - Brother勇

    展开全文
  • 压缩软件大家都用得多了,老司机们从网上下载个什么资源,很多情况下都会下载到压缩文件压缩文件的好处有很多,一来减少体积节省流量,二来打包方便可以一次性容纳N个文件,要使用这些压缩文件,压缩软件往往是必...

               压缩软件大家都用得多了,老司机们从网上下载个什么资源,很多情况下都会下载到压缩文件。压缩文件的好处有很多,一来减少体积节省流量,二来打包方便可以一次性容纳N个文件,要使用这些压缩文件,压缩软件往往是必不可少的。

    压缩软件使用简单,但其实很多朋友并没有意识到,这里面也存在一些大坑。今天,就来讲讲压缩软件的故事吧。

    方法/步骤

    1. 压缩软件的原理

      为什么压缩软件能够减少文件体积?无论是什么压缩软件,其目的就只有一个——减少冗余数据。这是什么意思呢?例如某行字是“000011111”,就可以压缩为“0(4)1(5)”,在保证数据没有受损的同时,减少其占用的体积。

      哪种压缩格式/软件最好?看完秒懂

    2. 上面的例子比较简单,实际上压缩软件的算法是复杂且多种多样的。

      不同的压缩软件会使用不同的字典,用来查找压缩冗余的数据,算法结合字典在很大程度上决定了压缩的效率。

      我们经常会看到不同的压缩文件格式,例如ZIP、RAR、7Z等,实际上这只是不同的压缩规范,就算是同样的格式,例如大家都是ZIP,其中的压缩算法可能也是不一样的,ZIP就可以使用Shrinking、Reducing、Deflate等算法。

      某个压缩文件压缩率高不高,不但要看其文件格式,更要看其具体使用的算法(例如ZIP和7Z都可以使用Deflate算法)。

      至于用哪个压缩软件最高效,实际上绝大多数的压缩软件,都没有自己的压缩算法,本质上只是马甲。

      主流的压缩文件格式大致有三种,分别是ZIP、RAR和7Z,它们分别来自Winzip、Winrar以及7-Zip,下面我们来说说这三种格式及其背后的压缩软件吧。

    3. ZIP:事实上的标准格式

      这是一个历史非常悠久的压缩格式,也是事实上的标准格式。

      你可以看到各大软件商发布软件时,提供的往往都是ZIP格式的压缩文件包,各大操作系统也对ZIP格式有着比较好的支持,例如Win系统中就可以直接访问ZIP文件中的内容。

      不过,这个最被广泛支持、被最多人认同的格式,其开发者的命运却有点悲情——ZIP格式的发明者Philip Katz英年早逝,37岁就因为酗酒去世了。

       

    4. 在DOS操作系统仍在盛行的时代,最流行的压缩格式是ARC。ARC效率慢且封闭,使用对应的压缩软件还要付费,Philip Katz对其不满,于是Philip Katz开发出了PKARC这款完全兼容ARC的软件。

      不料因为此事,Philip Katz被ARC告上法庭并败诉,不得不放弃PKARC的开发。

      Philip Katz并没有放弃压缩软件的钻研,他随后开发出了PKZIP这款软件,首创了ZIP格式。就算到了今天,你开启任何ZIP文件,仍可以在文件头中看到“PK”的字样,这就是Philip Katz名字的缩写。

      ZIP的表现全方面压制了ARC,速度更快压缩比更高,而且Philip Katz开放了ZIP格式,任何压缩软件都可以创建ZIP。很快,ZIP就成为了最流行的压缩标准。

      ZIP是一种开放的格式,Philip Katz的PKWare公司并没有为ZIP格式注册专利。ZIP格式被多家软件商所利用,Winzip这款软件也是在那时候崛起的。Nico Mak利用开放的ZIP格式开发了Winzip,兼容Win系统。借着Win崛起的东风,Winzip成为了最流行的压缩软件之一。

    5. 再例如大家都很熟悉的Winrar,也使用了ZIP的算法,同时没有开放RAR算法给其他软件,这令Winrar一度成为最全能的压缩软件,一跃成为主流。

      Philip Katz的结局并不好,在2000年,他在一家汽车旅馆中去世,死时还握着酒瓶。

      ZIP的开放令其成为了最流行的格式,也是事实上的标准格式,家家户户都支持它。不过它也存在一些缺点。例如,它的压缩率相比RAR和7Z偏低,对Unicode字符支持并不好,缺乏修复功能,加密安全性一度堪忧等,RAR和7Z都令ZIP感到巨大的竞争压力。

      哪种压缩格式/软件最好?看完秒懂

    6. RAR:起于江湖盛行于中国

      在国外,其实RAR的流行程度和ZIP有差距;但在中国,RAR当之无愧是最流行的压缩格式。RAR格式源于Winrar这款软件,和ZIP不同,RAR格式并不开放,只免费发放了其解压组件。

      这意味着别的压缩软件只能解压RAR,不能创建RAR。和Winzip相比,RAR能压缩、解压ZIP和RAR,Winzip却不能压缩RAR,因此Winrar利用专利,取得了竞争优势。

    7. 这其实尚不足以让RAR流行起来,毕竟和ZIP对比,RAR的专利算法虽然压缩率更高一些,但速度也较慢。令RAR真正崛起的契机是破解组织的力挺——破解游戏往往使用了Winrar来压缩,而中国又是盗版游戏最横行的市场,RAR由此在中国开始流行。

    8. 游戏盗版行业可谓是不折不扣的灰色地带,RAR绝对称得上是起于江湖。

      为什么破解游戏喜欢使用RAR呢?

      首先,RAR对Unicode字符支持好,很多游戏都不是英文版,用ZIP压缩可能会出现乱码,而RAR不会;其次,RAR很早就支持分卷压缩,不少破解游戏体积都很大,要把它们装进盗版光盘,就得用RAR分卷。

      而RAR的分卷文件,一度只能用Winrar开启。于是,盗版游戏玩家们纷纷成为了Winrar的拥簇,在中国Winrar成为了最万能的压缩软件,流行度完全盖过了Winzip。

       

      哪种压缩格式/软件最好?看完秒懂

    9. RAR的成功,一方面是由于专利保护,令其处在了竞争的有利位置上;另一方面它的确也比较先进。RAR压缩率稍高,对分卷压缩支持好,早早支持AES加密安全性好,而且还自带修复功能——不少由于光盘划花导致的数据错误,就是靠RAR的CRC修复得而完璧归赵的。

      不过,RAR的封闭始终是个问题,它最开始是收费软件,现在针对中国发行了带广告的免费版,但人们还是更倾向于使用破解版。随着7-ZIP的出现,万能压缩软件越来越多,虽然RAR格式仍在流行,但很多人已经不再使用Winrar这款软件。

    https://sparanoid.com/lab/7z

     

    10. 7-Zip在国内不流行的一大原因可能是界面太简陋,但就是这样的风格,社会你7哥,人狠话不多

    最良心的一点是,7-Zip和7Z是完全开源的!因此,它的内核被很多其他压缩软件所使用,国产压缩软件通常就是7-Zip的忠实拥簇,压缩软件中的“坑”也由此而来。

    7-Zip开源,但它使用了LGPL开源协议,某个软件如果使用了7-Zip的源码,按理来说也必须开源。但国内的“X压”等软件非但没有开源,还在压缩文件的文件头中故意加入无助于压缩的私货,让其他压缩软件无法解压。

    用了人家的代码还故意制造不兼容,对于这种行为,只想说一句,“我从未见过如此厚颜无耻之人”!

    11. 总结

    总体来说,在压缩文件格式方面,笔者是比较推荐大家压缩成ZIP格式的,毕竟这个格式拥有着最广泛的支持。

    在压缩软件的选择上,大家可以优先考虑7-Zip,对分卷压缩有特殊要求的朋友,则可以使用Winrar。对于某些不厚道的国产压缩软件,大家还是少碰为好,这种坑不仅坑自己,也会坑到别人。

    其他压缩软件对比:

    WinRAR、7-Zip、好压、360压缩、快压 五软件性能对比
    1:谁压的最小(好压、360压缩自有格式压缩文本)非常优秀。快压整体成绩高,但zip格式和自有格式大小相同。

    2:谁压的最快:7-Zip和好压速度名列前茅,快压则比较慢(个人认为快压算法可能自主格式和zip是一样的,360压缩速度最快和文件最小,实际zip和7Z格式)。

    3:谁格式最全:7-Zip超强资源提取工具,exe、dll等都可以解压出来。
    (一)WinRAR特点:
    1:预测功能:未开始压缩前,可预测压缩后大小和时间。
    2:超强文件管理工具,可做资源管理器使用。
    3:超强修复功能,尤其是RAR的修复。
    (二)好压
    1:可以挂载光盘镜像。

    2:丰富插件扩展,在压缩包内查看图片。
    (三)360压缩
    1:不仅解压,在压缩时也支持RAR格式。
     (四)快压
    1:自有的KZ格式,具有超强的压缩能力,即使像jpg图片也能继续压缩。
    2:支持虚拟光驱。

    在上述分析当中,我会推荐7-Zip和好压两个软件(WinRAR是收费的,算法没有什么改观)。

    1:7-Zip为首选软件,最干净压缩率极高,提取功能优异,为很多压缩软件效仿。

    2:其次是好压,简单易用功能全面。

    3:360压缩整体性能比其他软件弱,不过对使用者习惯上还很有一套。
    总之,国产软件都有不错成绩,希望以此为荐,做出更好的产品。

    个人推荐2345好压和7-zip 这两个可以一起下载,对于做CTF和日常使用都不错,用好压是因为不用解压就能看到图片,还有其他小功能。

     

    展开全文
  • 压缩压缩命令

    2018-07-29 11:34:03
    常用压缩格式: .zip .gz .bz2 常用压缩格式: .tar.gz .tar.bz2 常用压缩格式: .zip ....它的后缀名可写可不写,但是为了让管理员知道这是什么压缩格式最好表明   .zip格式解压缩 unzip 压缩文件...
    • 常用压缩格式:   .zip  .gz  .bz2
    • 常用压缩格式:   .tar.gz   .tar.bz2

    常用压缩格式:   .zip  .gz  .bz2

    .zip格式压缩

    • zip 压缩文件夹 源文件
    • 压缩文件
    • zip -r 压缩文件名 源文件
    • 压缩目录

    它的后缀名可写可不写,但是为了让管理员知道这是什么压缩格式最好表明

     

    .zip格式解压缩

    • unzip 压缩文件

    ​​​​​​​ 

    .gz格式压缩(Linux专有解压缩格式,但是windows可以解压)

    • gzip 源文件

    • 压缩为.gz格式的压缩文件,源文件会消失

    • gzip -c 源文件>压缩文件

    • 压缩为.gz格式,源文件保存

    • gzip -r 目录

    • 压缩文件下的所有子文件,但是不能压缩目录 

     .gz格式解压缩

    • gzip -d 压缩文件

    ​​​​​​​

    • gunzip 压缩文件

     

    解压目录

    .bz2格式压缩(不能压缩目录)

    • bzip2 源文件
    • 压缩格式为.bz2,不保留源文件

    ​​​​​​​

    • bzip2 -k 源文件
    • 压缩之后保留源文件

     

    .bz2解压 

    • bzip2 -d 压缩文件
    • bunzip2 压缩文件

    常用压缩格式:   .tar.gz   .tar.bz2

    因为.bz2格式压缩(不能压缩目录),把目录打包,在进行压缩

    打包命令tar

    • tar -cvf 打包文件夹 源文件
    • 选项:
    1. ​​​​​​​-c 打包
    2. -v 显示过程
    3. -f 制定打包后的文件名

    解打包命令

    • tar -xvf 打包文件名
    • 选项:
    1. ​​​​​​​-x    解打包

    ​​​​​​​​​​​​​​

    .tar.gz压缩格式

    其实.tar.gz格式是先打包为.tar格式,再压缩为.gz格式

    • tar -zcvf 压缩包名.tar.gz 源文件
    • 选项:
    1. ​​​​​​​-z    压缩为.gz格式

    ​​​​​​​

    • ​​​​​​​tar -zxvf 压缩包名.tar.gz
    • 选项:
    1. ​​​​​​​-x     解压缩.tar.gz格式

    .tar.gz2压缩格式

    • tar -jcvf 压缩包名.tar.gz2源文件
    • 选项:
    1. ​​​​​​​-j    压缩为.gz2格式

     

    • ​​​​​​​tar -jxvf 压缩包名.tar.gz2
    • 选项:
    1. ​​​​​​​-x     解压缩.tar.gz2格式

    ​​​​​​​

    tar -ztvf 压缩包名.tar.gz         -t  为查看压缩包中的内容

    压缩多个文件到指定目录

     

     

     

     

     

     

     

     

    展开全文
  • 文件格式(图像 IO 14.3)

    2017-10-06 00:17:00
    PNG图片使用的无损压缩算法可以比使用JPEG的图片做到更快地解压,但是由于闪存访问的原因,这些加载的时间并没有什么区别。 清单14.6展示了标准的应用程序加载不同尺寸图片所需要时间的一些代码。为了保证实验的...

    文件格式

    图片加载性能取决于加载大图的时间和解压小图时间的权衡。很多苹果的文档都说PNG是iOS所有图片加载的最好格式。但这是极度误导的过时信息了。

    PNG图片使用的无损压缩算法可以比使用JPEG的图片做到更快地解压,但是由于闪存访问的原因,这些加载的时间并没有什么区别。

    清单14.6展示了标准的应用程序加载不同尺寸图片所需要时间的一些代码。为了保证实验的准确性,我们会测量每张图片的加载和绘制时间来确保考虑到解压性能的因素。另外每隔一秒重复加载和绘制图片,这样就可以取到平均时间,使得结果更加准确。

    清单14.6

     1 #import "ViewController.h"
     2 
     3 static NSString *const ImageFolder = @"Coast Photos";
     4 
     5 @interface ViewController () 
     6 
     7 @property (nonatomic, copy) NSArray *items;
     8 @property (nonatomic, weak) IBOutlet UITableView *tableView;
     9 
    10 @end
    11 
    12 @implementation ViewController
    13 
    14 - (void)viewDidLoad
    15 {
    16     [super viewDidLoad];
    17     //set up image names
    18     self.items = @[@"2048x1536", @"1024x768", @"512x384", @"256x192", @"128x96", @"64x48", @"32x24"];
    19 }
    20 
    21 - (CFTimeInterval)loadImageForOneSec:(NSString *)path
    22 {
    23     //create drawing context to use for decompression
    24     UIGraphicsBeginImageContext(CGSizeMake(1, 1));
    25     //start timing
    26     NSInteger imagesLoaded = 0;
    27     CFTimeInterval endTime = 0;
    28     CFTimeInterval startTime = CFAbsoluteTimeGetCurrent();
    29     while (endTime - startTime < 1) {
    30         //load image
    31         UIImage *image = [UIImage imageWithContentsOfFile:path];
    32         //decompress image by drawing it
    33         [image drawAtPoint:CGPointZero];
    34         //update totals
    35         imagesLoaded ++;
    36         endTime = CFAbsoluteTimeGetCurrent();
    37     }
    38     //close context
    39     UIGraphicsEndImageContext();
    40     //calculate time per image
    41     return (endTime - startTime) / imagesLoaded;
    42 }
    43 
    44 - (void)loadImageAtIndex:(NSUInteger)index
    45 {
    46     //load on background thread so as not to
    47     //prevent the UI from updating between runs dispatch_async(
    48     dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    49         //setup
    50         NSString *fileName = self.items[index];
    51         NSString *pngPath = [[NSBundle mainBundle] pathForResource:filename
    52                                                             ofType:@"png"
    53                                                        inDirectory:ImageFolder];
    54         NSString *jpgPath = [[NSBundle mainBundle] pathForResource:filename
    55                                                             ofType:@"jpg"
    56                                                        inDirectory:ImageFolder];
    57         //load
    58         NSInteger pngTime = [self loadImageForOneSec:pngPath] * 1000;
    59         NSInteger jpgTime = [self loadImageForOneSec:jpgPath] * 1000;
    60         //updated UI on main thread
    61         dispatch_async(dispatch_get_main_queue(), ^{
    62             //find table cell and update
    63             NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
    64             UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    65             cell.detailTextLabel.text = [NSString stringWithFormat:@"PNG: %03ims JPG: %03ims", pngTime, jpgTime];
    66         });
    67     });
    68 }
    69 
    70 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    71 {
    72     return [self.items count];
    73 }
    74 
    75 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    76 {
    77     //dequeue cell
    78     UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell"];
    79     if (!cell) {
    80         cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier:@"Cell"];
    81     }
    82     //set up cell
    83     NSString *imageName = self.items[indexPath.row];
    84     cell.textLabel.text = imageName;
    85     cell.detailTextLabel.text = @"Loading...";
    86     //load image
    87     [self loadImageAtIndex:indexPath.row];
    88     return cell;
    89 }
    90 
    91 @end
    View Code

    PNG和JPEG压缩算法作用于两种不同的图片类型:JPEG对于噪点大的图片效果很好;但是PNG更适合于扁平颜色,锋利的线条或者一些渐变色的图片。为了让测评的基准更加公平,我们用一些不同的图片来做实验:一张照片和一张彩虹色的渐变。JPEG版本的图片都用默认的Photoshop60%“高质量”设置编码。结果见图片14.5。

    图14.5 不同类型图片的相对加载性能

    如结果所示,相对于不友好的PNG图片,相同像素的JPEG图片总是比PNG加载更快,除非一些非常小的图片、但对于友好的PNG图片,一些中大尺寸的图效果还是很好的。

    所以对于之前的图片传送器程序来说,JPEG会是个不错的选择。如果用JPEG的话,一些多线程和缓存策略都没必要了。

    但JPEG图片并不是所有情况都适用。如果图片需要一些透明效果,或者压缩之后细节损耗很多,那就该考虑用别的格式了。苹果在iOS系统中对PNG和JPEG都做了一些优化,所以普通情况下都应该用这种格式。也就是说在一些特殊的情况下才应该使用别的格式。

    混合图片

    对于包含透明的图片来说,最好是使用压缩透明通道的PNG图片和压缩RGB部分的JPEG图片混合起来加载。这就对任何格式都适用了,而且无论从质量还是文件尺寸还是加载性能来说都和PNG和JPEG的图片相近。相关分别加载颜色和遮罩图片并在运行时合成的代码见14.7。

    清单14.7 从PNG遮罩和JPEG创建的混合图片

     1 #import "ViewController.h"
     2 
     3 @interface ViewController ()
     4 
     5 @property (nonatomic, weak) IBOutlet UIImageView *imageView;
     6 
     7 @end
     8 
     9 @implementation ViewController
    10 
    11 - (void)viewDidLoad
    12 {
    13     [super viewDidLoad];
    14     //load color image
    15     UIImage *image = [UIImage imageNamed:@"Snowman.jpg"];
    16     //load mask image
    17     UIImage *mask = [UIImage imageNamed:@"SnowmanMask.png"];
    18     //convert mask to correct format
    19     CGColorSpaceRef graySpace = CGColorSpaceCreateDeviceGray();
    20     CGImageRef maskRef = CGImageCreateCopyWithColorSpace(mask.CGImage, graySpace);
    21     CGColorSpaceRelease(graySpace);
    22     //combine images
    23     CGImageRef resultRef = CGImageCreateWithMask(image.CGImage, maskRef);
    24     UIImage *result = [UIImage imageWithCGImage:resultRef];
    25     CGImageRelease(resultRef);
    26     CGImageRelease(maskRef);
    27     //display result
    28     self.imageView.image = result;
    29 }
    30 
    31 @end
    View Code

     

    对每张图片都使用两个独立的文件确实有些累赘。JPNG的库(https://github.com/nicklockwood/JPNG)对这个技术提供了一个开源的可以复用的实现,并且添加了直接使用+imageNamed:+imageWithContentsOfFile:方法的支持。

    JPEG 2000

    除了JPEG和PNG之外iOS还支持别的一些格式,例如TIFF和GIF,但是由于他们质量压缩得更厉害,性能比JPEG和PNG糟糕的多,所以大多数情况并不用考虑。

    但是iOS之后,苹果低调添加了对JPEG 2000图片格式的支持,所以大多数人并不知道。它甚至并不被Xcode很好的支持 - JPEG 2000图片都没在Interface Builder中显示。

    但是JPEG 2000图片在(设备和模拟器)运行时会有效,而且比JPEG质量更好,同样也对透明通道有很好的支持。但是JPEG 2000图片在加载和显示图片方面明显要比PNG和JPEG慢得多,所以对图片大小比运行效率更敏感的时候,使用它是一个不错的选择。

    但仍然要对JPEG 2000保持关注,因为在后续iOS版本说不定就对它的性能做提升,但是在现阶段,混合图片对更小尺寸和质量的文件性能会更好。

    PVRTC

    当前市场的每个iOS设备都使用了Imagination Technologies PowerVR图像芯片作为GPU。PowerVR芯片支持一种叫做PVRTC(PowerVR Texture Compression)的标准图片压缩。

    和iOS上可用的大多数图片格式不同,PVRTC不用提前解压就可以被直接绘制到屏幕上。这意味着在加载图片之后不需要有解压操作,所以内存中的图片比其他图片格式大大减少了(这取决于压缩设置,大概只有1/60那么大)。

    但是PVRTC仍然有一些弊端:

    • 尽管加载的时候消耗了更少的RAM,PVRTC文件比JPEG要大,有时候甚至比PNG还要大(这取决于具体内容),因为压缩算法是针对于性能,而不是文件尺寸。

    • PVRTC必须要是二维正方形,如果源图片不满足这些要求,那必须要在转换成PVRTC的时候强制拉伸或者填充空白空间。

    • 质量并不是很好,尤其是透明图片。通常看起来更像严重压缩的JPEG文件。

    • PVRTC不能用Core Graphics绘制,也不能在普通的UIImageView显示,也不能直接用作图层的内容。你必须要用作OpenGL纹理加载PVRTC图片,然后映射到一对三角板来在CAEAGLLayer或者GLKView中显示。

    • 创建一个OpenGL纹理来绘制PVRTC图片的开销相当昂贵。除非你想把所有图片绘制到一个相同的上下文,不然这完全不能发挥PVRTC的优势。

    • PVRTC使用了一个不对称的压缩算法。尽管它几乎立即解压,但是压缩过程相当漫长。在一个现代快速的桌面Mac电脑上,它甚至要消耗一分钟甚至更多来生成一个PVRTC大图。因此在iOS设备上最好不要实时生成。

    如果你愿意使用OpehGL,而且即使提前生成图片也能忍受得了,那么PVRTC将会提供相对于别的可用格式来说非常高效的加载性能。比如,可以在主线程1/60秒之内加载并显示一张2048×2048的PVRTC图片(这已经足够大来填充一个视网膜屏幕的iPad了),这就避免了很多使用线程或者缓存等等复杂的技术难度。

    Xcode包含了一些命令行工具例如texturetool来生成PVRTC图片,但是用起来很不方便(它存在于Xcode应用程序束中),而且很受限制。一个更好的方案就是使用Imagination Technologies PVRTexTool,可以从http://www.imgtec.com/powervr/insider/sdkdownloads免费获得。

    安装了PVRTexTool之后,就可以使用如下命令在终端中把一个合适大小的PNG图片转换成PVRTC文件:

    /Applications/Imagination/PowerVR/GraphicsSDK/PVRTexTool/CL/OSX_x86/PVRTexToolCL -i {input_file_name}.png -o {output_file_name}.pvr -legacypvr -p -f PVRTC1_4 -q pvrtcbest
    

    清单14.8的代码展示了加载和显示PVRTC图片的步骤(第6章CAEAGLLayer例子代码改动而来)。

    清单14.8 加载和显示PVRTC图片

      1 #import "ViewController.h" 
      2 #import  
      3 #import 
      4 
      5 @interface ViewController ()
      6 
      7 @property (nonatomic, weak) IBOutlet UIView *glView;
      8 @property (nonatomic, strong) EAGLContext *glContext;
      9 @property (nonatomic, strong) CAEAGLLayer *glLayer;
     10 @property (nonatomic, assign) GLuint framebuffer;
     11 @property (nonatomic, assign) GLuint colorRenderbuffer;
     12 @property (nonatomic, assign) GLint framebufferWidth;
     13 @property (nonatomic, assign) GLint framebufferHeight;
     14 @property (nonatomic, strong) GLKBaseEffect *effect;
     15 @property (nonatomic, strong) GLKTextureInfo *textureInfo;
     16 
     17 @end
     18 
     19 @implementation ViewController
     20 
     21 - (void)setUpBuffers
     22 {
     23     //set up frame buffer
     24     glGenFramebuffers(1, &_framebuffer);
     25     glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
     26     //set up color render buffer
     27     glGenRenderbuffers(1, &_colorRenderbuffer);
     28     glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
     29     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderbuffer);
     30     [self.glContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:self.glLayer];
     31     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_framebufferWidth);
     32     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_framebufferHeight);
     33     //check success
     34     if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
     35         NSLog(@"Failed to make complete framebuffer object: %i", glCheckFramebufferStatus(GL_FRAMEBUFFER));
     36     }
     37 }
     38 
     39 - (void)tearDownBuffers
     40 {
     41     if (_framebuffer) {
     42         //delete framebuffer
     43         glDeleteFramebuffers(1, &_framebuffer);
     44         _framebuffer = 0;
     45     }
     46     if (_colorRenderbuffer) {
     47         //delete color render buffer
     48         glDeleteRenderbuffers(1, &_colorRenderbuffer);
     49         _colorRenderbuffer = 0;
     50     }
     51 }
     52 
     53 - (void)drawFrame
     54 {
     55     //bind framebuffer & set viewport
     56     glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
     57     glViewport(0, 0, _framebufferWidth, _framebufferHeight);
     58     //bind shader program
     59     [self.effect prepareToDraw];
     60     //clear the screen
     61     glClear(GL_COLOR_BUFFER_BIT);
     62     glClearColor(0.0, 0.0, 0.0, 0.0);
     63     //set up vertices
     64     GLfloat vertices[] = {
     65         -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f
     66     };
     67     //set up colors
     68     GLfloat texCoords[] = {
     69         0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f
     70     };
     71     //draw triangle
     72     glEnableVertexAttribArray(GLKVertexAttribPosition);
     73     glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
     74     glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, vertices);
     75     glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, texCoords);
     76     glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
     77     //present render buffer
     78     glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
     79     [self.glContext presentRenderbuffer:GL_RENDERBUFFER];
     80 }
     81 
     82 - (void)viewDidLoad
     83 {
     84     [super viewDidLoad];
     85     //set up context
     86     self.glContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
     87     [EAGLContext setCurrentContext:self.glContext];
     88     //set up layer
     89     self.glLayer = [CAEAGLLayer layer];
     90     self.glLayer.frame = self.glView.bounds;
     91     self.glLayer.opaque = NO;
     92     [self.glView.layer addSublayer:self.glLayer];
     93     self.glLayer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking: @NO, kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8};
     94     //load texture
     95     glActiveTexture(GL_TEXTURE0);
     96     NSString *imageFile = [[NSBundle mainBundle] pathForResource:@"Snowman" ofType:@"pvr"];
     97     self.textureInfo = [GLKTextureLoader textureWithContentsOfFile:imageFile options:nil error:NULL];
     98     //create texture
     99     GLKEffectPropertyTexture *texture = [[GLKEffectPropertyTexture alloc] init];
    100     texture.enabled = YES;
    101     texture.envMode = GLKTextureEnvModeDecal;
    102     texture.name = self.textureInfo.name;
    103     //set up base effect
    104     self.effect = [[GLKBaseEffect alloc] init];
    105     self.effect.texture2d0.name = texture.name;
    106     //set up buffers
    107     [self setUpBuffers];
    108     //draw frame
    109     [self drawFrame];
    110 }
    111 
    112 - (void)viewDidUnload
    113 {
    114     [self tearDownBuffers];
    115     [super viewDidUnload];
    116 }
    117 
    118 - (void)dealloc
    119 {
    120     [self tearDownBuffers];
    121     [EAGLContext setCurrentContext:nil];
    122 }
    123 
    124 @end
    View Code

     

    如你所见,非常不容易,如果你对在常规应用中使用PVRTC图片很感兴趣的话(例如基于OpenGL的游戏),可以参考一下GLView的库(https://github.com/nicklockwood/GLView),它提供了一个简单的GLImageView类,重新实现了UIImageView的各种功能,但同时提供了PVRTC图片,而不需要你写任何OpenGL代码。

    转载于:https://www.cnblogs.com/EchoHG/p/7630320.html

    展开全文
  • BMP:优点(无损压缩,图质最好),缺点(文件太大,不利于网络传输) GIF:优点(动画存储格式),缺点(最多256色,...JPG:JPEG图片格式的设计目标,是在不影响人类可分辨的图片质量的前提下,尽可能的压缩文件大...
  • 推荐三款最好用的压缩/解压软件

    千次阅读 2020-11-21 15:03:31
    zip格式兼容性最好,也是目前用的最多的压缩格式。兼容性是什么?就是说几乎在任何设备和软件上,不用外部解压软件,都能正常打开zip格式。比如我们在QQ群里面传输办公文件的时候,都会使用zip格式,方便手机端直接...
  • 史上超高压缩软件2009

    2009-09-04 14:46:16
    0.231 加入了解压时自定解压缩文件的路径.出现错误时立即停止程序而不继续压缩/解压. 优化内核程序使压缩/解压速度提高了4%.增加了使用示例.修正了几个不重要的小bug. 0.230l 由0.230完整版修改而成. 0.230 UDA的第...
  • 批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行...
  • PDG文件批量转换PDF

    热门讨论 2011-03-24 14:55:37
    再点击“选择存放转换出来的图象文件的文件夹”下一行右边的那个打开文件夹图标单击后,注意:这里最好选一个新的空白文件夹,为什么要用一个新的文件夹?因为这样会比较方便你管理,要是你突然想把图片和PDG文件...
  • 一个小巧免费的流程图绘制工具,Diagram Designer。速度飞快,无需安装。我想对大多数人来说,无论是画流程图,还是设计界面,还是做一些简单的演示,都够用了。... 使用压缩格式,使得文件尺寸最小
  • 您需要什么。 您可以通过编写您的输入来选择输入和输出点 自己的时间码,或通过逐帧按钮。您将显示 在两个单独的屏幕中,文件的开头和结尾。 微调图像 是否有文件 .nef,.cr2,.psd,.pdf,.png,.jpg ...格式 ...
  • 总之,Easy Realmedia Producer是一款功能非常强大的real格式文件压缩软件,有兴趣的朋友赶紧试试吧! 绿化说明: 由于两个软件使用了一个载体,而Easy RealMedia Editor 1.73又是寄生的部分,所以只能写个BAT...
  • 使用JPEG可以指定所需的压缩级(从1%到99%)。可以选择是否包括光标。另外还具有自动缩放,颜色减少,单色转换,抖动,以及转换为灰度级,可以将整个网页保存为Flash或pdf格式方便阅览。 内置强大的编辑与格式转换...
  • 大家可能都知道flac为无损压缩音频格式,简单的说一下,为什么说flac是无损音呢?因为和cd音质是最相近的,但是其实cd也是经过处理和压缩的东西,所以flac是目前可以下载到的最好的音源了。mp3为有损压缩音频格式,...
  • 因为和CD音质是最相近的,但是其实CD也是经过处理和压缩的东西,所以FLAC是目前可以下载到的最好的音源了.MP3为有损压缩音频格式,FLAC转MP3也就是无损转换成有损压缩,在压缩的时候会丢失部分信息,多少也会影响到...
  • 制作epub书分成两个步骤:处理内容文件;进行压缩(放到压缩"容器"中)。 制作内容文件可以参见本人以前的几篇博文。《epub电子书格式》的介绍,这里只对内容和结构作些...[ epub格式什么打开_epub 格式如何打开 ]
  • 最好以不同的格式压缩不同的屏幕截图 较小的尺寸就可以 也就是说,通常您可以使用较小的版本,较低的质量和较少的颜色,这只是原始尺寸的一小部分。 例如,我将其用于在Tidllywiki中嵌入(很多)较小的图像(base-...
  • Axx:ARJ压缩文件的分包序号文件,用于将一个大文件压至几个小的压缩包中(xx取01-99的数字) A3L:Authorware 3.x库文件 A4L:Authorware 4.x库文件 A5L:Authorware 5.x库文件 A3M,A4M:Authorware Macintosh...
  • 压缩的EDN压缩文件(会剥离所有可选的空白)在。 最终的变体( export.compact.min.edn )可能会为大多数人提供最好的服务。 运行导出器 您也可以像这样手动运行导出过程: $ lein run 新鲜的出口将被置于“ ...
  • unity webgl启动时间优化

    万次阅读 2018-06-19 18:57:18
    接触过unity发布成webgl的都应该被其加载的启动时间恶心过吧,真的很慢,对用户体验很差我的解决办法是1.Resources文件夹里东西越多越慢,能弄成ab包就尽量弄成,图片资源预知体什么最好别放这文件夹下2....
  • 面试官: 音视频是什么,视频为什么需要压缩 心理分析:很多人对音视频的概念停留在 苍老师的小电影上,只能理解他是一个视频文件。面试官考的对视频文件下的封装格式,视频文件组成和音视频开发有没相关的概念 *...
  • 传统的图像压缩格式对于简单的图片来说,还可以接受,但对于强对比色彩区域之间的色彩反差的表现则大打折扣,这也是为什么它们对于文字的还原难以令人满意的原因。一般来说,要确保文字和线条的清晰度需要较高的...
  • FreeUnRAR 不支持文件名加密的RAR压缩包(即用WINRAR打开时需要先输入密码才能看到文件名的压缩包)有些压缩包压缩的时候使用的是“较好”或“最好”的压缩模式,由于RAR压缩算法的PPM内存原理,解压时占用的内存必须...
  • PNG图片使用的无损压缩算法可以比使用JPEG的图片做到更快地解压,但是由于闪存访问的原因,这些加载的时间并没有什么区别。 清单14.6展示了标准的应用程序加载不同尺寸图片所需要时间的一些代码。为了保证实验的...
  • 2,从官方下载ruby的exe格式安装文件,安装到磁盘,不要安装到program files文件夹下,因为有个空格,会有问题。最好放在磁盘根目录。3,下载rails的zip包。解压缩到ruby的安装目录。同时下载的还有相同版本的...
  • "压缩成Gzip格式", 否则压缩出的文件,在服务器端没法解压, 反之,如果支持的话,就选中,因为压缩成gz格式,可以大大减小文件大小。 5 运行 unzip.php,将刚才在本机压缩出的文件通过 unzip.php 上传,上传后...
  • CD转APE全攻略 转

    2008-10-20 16:16:00
    这是目前公认的音质最好的载体,但代价也是巨大的,一张80分钟的CD,如果不经过任何压缩,直接用软件抓轨(CD光盘的具体音乐信息在电脑的WINDOWS操作系统中是不可见的,把CD音乐由不可见的光盘上抓下来保存在硬盘上...
  • 包括批量格式转换、批量脚本处理、批量文件改名、批量调整尺寸、批量制作缩略图、批量压缩JPG、批量合并图片、批量添加背景、批量截取图片、批量切割图片、批量上传文件、创建PDF文件、创建多页TIF、创建电子相册等...
  • 显示选择输出目的地的选项,该目的地应该是(最好是空的)FAT格式的SD卡或任何其他文件夹。 下载最新版本的HiyaCFW并解压缩。 从NAND转储中自动检测控制台区域,下载并解密其v512启动器。 为自定义固件创建修补的...
  • 视频编辑专家

    2015-04-03 14:37:54
    视频合并:把多个不同或相同的音视频格式文件合并成一个音视频文件  2.视频分割:把一个视频文件分割成任意大小和数量的视频文件  3.视频截取:把您喜爱的视频文件截取出精华的一段加以保存  硬件兼容  全面支持...

空空如也

空空如也

1 2 3 4 5 6
收藏数 116
精华内容 46
关键字:

压缩文件什么格式最好