文件压缩如何工作?

比喻是解释这一点的好方法。

想象一下,我们所有人都不得不使用复杂的定义,而不是用简短的词来表示复杂的定义。 压缩将复杂的想法压缩成较小的单词。

例如,让我们做一些实际的压缩。

假设我有一句话要发送给朋友:

“我非常希望所有人在我们目前还活着的那块大石头上开始无争议的贸易和商业交易。”

这句话表达了我想要世界和平的念头,但是这句话很罗word,但我的朋友只能理解这些单词,而不能理解我们更经常使用的更复杂的单词。 独自一人,如果不知道除了提供的单词以外的其他单词,我们就不能使这句话简短得多。 如果我们创建一个短单词的字典来代表较长的短语,我们可以生成一个较短的句子!

字典:
博伯:我有个好主意
护目镜:所有人
Frithy:无争议贸易的做法
Hobot:商业交易
地球:我们目前还活着的大石头

新句子[使用字典]
“戴上护目镜的泡沫将开始在地球上泛滥成灾。”

这句话绝对短! 当朋友想要理解句子时,他可以简单地用相应的定义替换句子中出现的词典中的单词,而替换不会丢失任何信息!

不幸的是,这实际上并不能使数据发送的更小,只是发送单个句子。 这是因为我们必须将字典IN ADDITION发送到新句子。 这消除了新句子的好处,并实际上增加了要传输的总数据的大小。

因此,您可能想知道类比的重点是什么? 毕竟,我们只是增加了数据的大小,而没有压缩它。

好吧,这种字典替换方法不适用于无模式的数据字符串。 相反,我可以将这样的内容发送给我的朋友:

“我们目前还活着的那块大石头。我们目前还活着的那块大石头。我们目前还活着的那块大石头。我们目前还活着的那块大石头。十四。我们目前还活着的那块大石头。我们现在还活着的那块大石头。我们现在还活着的那块大石头。我们现在还活着的那块大石头。紫色。”

该句子具有相同的短语,重复了八次:用字典替换可以帮助我们的东西!

字典:
E:“我们目前还活着的那块大石头。”

新句子[使用字典]
“ EEEE十四。EEEEpurple”

即使包含字典,这也是惊人的大小差异!

这类似于压缩在计算机中的工作方式:压缩程序查看常见重复项的数据,在字典中为其创建一个条目,然后用与模式对应的字典中的单词替换每次出现的重复对象。 这是无损压缩的本质。 还有一些其他类型的压缩专用于其他任务,但这是通用数据压缩。

某些应用程序压缩文件的方式之间的差异纯粹是实现细节。 他们通过尝试找到最快或最有效的方式来寻找模式并创建字典条目来进行竞争。 有些程序说这是他们的方式,而另一些程序说这是另一种方式。 最佳使用的文件通常取决于要压缩的文件类型。

非压缩

那个山姆我!
那个山姆我!
我不喜欢那个Sam-I-Am!
你喜欢绿鸡蛋和火腿吗?
我不喜欢他们,山姆,我!
我不喜欢绿鸡蛋和火腿!
您要在这里还是那里?
我不希望他们在这里或那里。
我不会在任何地方想要它们。
我不喜欢绿鸡蛋和火腿。
我不喜欢他们,Sam-I-Am。

总字符数= 322

压缩的

1 =帽子
2 = Sam-I-Am
3 =我不喜欢
4 =绿色鸡蛋和火腿
5 =您喜欢
6 =这里或那里
7 =我不想要他们

T1 2!
T1 2!
3 t1 2!
做5 4?
3 4!
5 6
7 6。
7在任何地方。
3 4。
3个,2个。

总字符数= 186。

压缩率= 58%。 在整个故事中,您几乎肯定会变得更好

通常以每秒24或30帧的速度拍摄视频。 这意味着每秒钟显示24、30或24个静止图像,以产生运动的错觉。 因为图像是如此紧密地联系在一起,所以并非图像中的所有内容都在帧之间移动。 压缩将更改存储在帧中,而不是存储整个帧。

在开始压缩更多视频时,您会经常遇到几个关键术语。

编解码器 :这是计算机用来确定帧之间发生的更改量的一种方法。

关键帧 :这是一个参考帧。 编解码器将每隔几帧确定一个关键帧。 这是接下来的几帧更改的基础。 您的关键帧间隔将对完成文件的大小产生很大影响。 许多关键帧将使文件很大但质量更高。 很少的关键帧会留下很多假象。

伪影 –这些是块状图像,是关键帧未正确更新的结果。 压缩质量越低,将出现更多的伪像。

比特/数据速率 –这是视频每秒使用的数据量。 通常,以千比特/秒为单位。 比特率可以是恒定的,也可以是可变的。 在整个视频中,恒定的比特率保持不变,这可能会导致视频文件更大。 可变的比特率会根据屏幕上的操作量而变化,这将导致文件变小。

可变比特率 :如果视频的比特率变化不够动态,则会降低质量。 尝试两种比特率,以找到大小和可接受质量之间的平衡。

帧率 :这是每秒的帧数。 视频通常以每秒24或30帧的速度拍摄。 保持压缩副本的帧速率相同,否则播放将受到影响,音频可能无法正确同步。

分辨率 :这是输出视频的大小。 以像素为单位,宽x高。

压缩YouTube / Vimeo的视频

1.了解为什么需要压缩。 原始视频文件(尤其是高清视频)可以运行几GB的大小。 您可以将大型文件上传到YouTube和Vimeo,但这可能需要很长时间。 同样,这些服务将在文件上传后压缩您的文件,并且通常结果质量不是很高。 自己压缩视频可让您控制大小和质量。

2.在视频编辑程序中打开原始视频文件。 网上有免费的解决方案,以及After Effects,Final Cut等专业产品。 特定菜单在程序之间会有所不同,但是设置在所有平台上都是通用的。

3.导出视频。 为了开始压缩过程,您将需要导出视频。 这会将视频转换为可在所有系统和设备上播放的格式,包括YouTube和Vimeo支持的格式。

4.选择文件格式。 文件格式将根据您打算如何处理最终文件而改变。 大多数系统和设备将播放MP4文件,使其成为最普遍接受的文件类型。 这包括PlayStation 3等游戏系统。

5.选择视频格式(编解码器)。 H.264是使用最广泛的编解码器,并且得到大多数系统的支持。 这是用于上传要在线流式传输的视频的首选编解码器。 高清视频应使用High Profile H.246进行编码。

6.选择比特率。 对于SD视频,请使用2,000-5,000 kbps之间的比特率。 720p视频的比特率应在5,000-10,000 kbps之间。 1080p视频的比特率应为10,000-20,000 kbps。

7.选择分辨率(图像尺寸)。 尝试使其与原始视频相同。 流媒体网站将在上传过程之后添加其自己的分辨率选项。

8.调整关键帧和帧频。 以与录制时相同的帧频对视频进行编码。如果每秒录制的帧数超过30帧,则将其编码一半(例如,将以30 FPS的速度编码60 FPS的视频)。 保持关键帧与帧速率相同。

9.选择编码模式。 通常,请使用多步(最佳)编码。 这将比单次通过花费更长的时间,但是会产生明显更高质量的视频。

10.设置音频选项。 选择AAC-LC作为音频格式,因为它具有最广泛的支持和最佳的质量。 对于数据速率,选择320 kbps。 如果您有音乐,请选择“立体声”。 如果没有音乐,请选择“单声道”。 您的输出采样率应为48.000 kHz

更多详细信息:最佳视频电影压缩软件

他们使用各种压缩技术。

我会给你一个简单技术的例子。 这称为霍夫曼最大方差技术。


在这里,您首先读取文件,然后找到该文件中每个符号出现的概率..然后按降序写入。 因此,文件中最常出现的符号将在顶部。[这里,符号A]

结合至少两个概率,并制作一个新的临时符号。 [在这里,将D和E组合在一起会生成一个符号E’(图中未显示,临时符号只是为了您的方便)]

这样做直到只有两个符号。

现在,这就是您的树的样子。

一种’

A B”

B’C’

B C D E

将分支的最小边分配为0,将分支的右边分配为1。

现在,

A = 0的码字。
B的码字= 100
C的代码字= 101
D的码字= 110
E的代码字= 111。

如果假设您的文件是AAAABCDE。 此处,符号A最常出现。

在压缩之前,您将为每个符号发送8位。 因此,它将是64位。

压缩后,您将发送0 0 0 0 100 101 110111。只有20位。

您还可以使用其他技术,例如LZ77,LZSS或LZ78方法。

文件压缩背后没有算法 。 取而代之的是,压缩算法使用了一系列 启发式方法 ,这些方法在实践中表现良好。 例如:

  • 霍夫曼编码着眼于字符/短字符串的频率,并通过将较短的代码分配给更频繁的对象来压缩输入。
  • 游程长度编码查看连续重复多次的内容,并将其编码为“重复xy次”
  • Lempel-Ziv-Welch和类似的压缩算法构建了一个字典,它们已经在输入中看到了字符串,然后在某些字符串重复时重新使用它们。 压缩文件将包含“回头看120个字符并从那里复制5个字符”之类的指令。
  • Burrows–Wheeler变换是bzip2中使用的“不可思议”的可逆字符串变换。 通常可以更好地压缩转换后的字符串,因为在转换之前在相似上下文中出现的内容在转换后是连续的。 (如果这没有意义,请随时接受它确实具有魔力。)
  • 某些压缩算法使用“元论”🙂
    例如,在压缩可移植网络图形(PNG)图像时,我们首先逐像素遍历图片,然后尝试从以前看到的像素中预测其值。 然后,代替压缩实际像素,我们压缩预测的误差 (即,预测偏离了多少)。 我们的预测越好,误差就越接近全零,压缩它们就越容易。
  • 还有其他压缩算法是有损的 :通过压缩文件,我们正在丢失信息。 更准确地说,我们通常在压缩文件的大小和结果的质量之间进行权衡。
    例如,在诸如MP3格式的音频格式中,我们基本上是通过简单的周期函数(例如正弦波)的集合来逼近原始波函数。 我们使用的磁盘越多,我们可以更精确地近似原始磁盘,但所需的磁盘空间也就越大。
    在压缩图片(例如JPEG)和视频(例如,MPEG-4和近年来的许多其他图像)时,存在类似的权衡。

最后,请注意,我们不能做得更好。 精确(无损)压缩将始终是这种方式:它将始终是可以正常工作的黑客的集合,因为我们最初存储信息的方式在可预测的方式上是多余的。 即使我们可以定义压缩文件最佳方式 (即,其Kolmogorov复杂度),我们也可以证明无法通过算法计算出这种压缩率。

A2A。

根据文件类型,可以使用很多压缩技术。

假设您有一个英文文本文件。 如果使用ASCII编码,则文件中的每个字母将使用8位。 但是,从下图可以看出,字母表中的所有字母并非经常出现。
(来源:信件频率)
因此,如果将较小的位代码分配给出现频率更高的字母,则每个字母的平均位会减少。 您可以在此处阅读详细信息。

如果您有图像文件,则可以利用其他属性对其进行压缩。 大多数自然图像将具有颜色相似的大区域。 因此,如果使用8位来表示一个像素的颜色,那么存储相邻像素的颜色就不需要8位,因为两个像素之间的差异很小,可以用更少的像素来表示位。

大多数压缩程序使用基于LZ自适应字典的算法的变体来缩小文件。 “ LZ”是指算法的创建者Lempel和Ziv ,“字典”是指对数据进行分类的方法。
在世界上大多数语言中,某些字母和单词通常以相同的样式一起出现。 由于冗余率很高,因此文本文件的压缩效果非常好。 大小合适的文本文件通常会减少50%或更多。 大多数编程语言也非常冗余,因为它们使用相对较少的命令集合,这些命令通常以设定的模式一起使用。 包含大量独特信息的文件,例如图形或MP3文件,无法使用此系统进行太多压缩,因为它们不会重复很多模式(下一节将对此进行详细介绍)。
如果文件具有很多重复模式,则减少率通常会随文件大小而增加。 同样,在更长的工作中可能会出现更普遍的模式,从而使我们能够创建更有效的字典。

该效率还取决于压缩程序使用的特定算法。 一些程序特别适合于拾取某些类型文件中的模式,因此可以更简洁地对其进行压缩。 其他的则在字典中包含字典,这些字典对于大型文件可能会有效压缩,而对于较小的文件则不会有效。 尽管所有此类压缩程序都具有相同的基本思想,但实际上执行方式有很多变化。 程序员一直在尝试构建更好的系统。

最笼统地说:

A)确定一个特征,该特征通常是我们实际要压缩的文件比一般文件更真实,并且在更大程度上是真实的。 一些例子:

  • 某些值比其他值更有可能出现; 例如,在ASCII文件中,包含字母和数字的“上”值比“下”值出现的频率要高得多。
  • 一次出现的值模式很可能会再次出现; 例如,如果模式“ the”出现在文件中的任何位置,则很可能发生多次。
  • 价值以某些方式出现。 例如,数值只能上升,而不能下降。

B)然后我们找到表达文件内容的方法,在这里我们可以说“这部分数据与我们确定的特征相匹配”,然后,在极大地缩小了数据的可能性之后,我们需要更少的位来传达什么该数据是。 一些例子:

  • 在最佳霍夫曼编码中,对值进行编码所需的位数是其概率的反对数,四舍五入。 因此,出现时间为1/2的值将用单个位(例如“ 0”)进行编码; 所有其他值将以“ 1”开头。
  • 在“滑动窗口”压缩中,编码器和解码器都跟踪缓冲区中最近处理过的N个字符(其中N是尽可能大的值,例如32K)。 新数据可以表示为文字值,也可以通过查找缓冲区中已经存在的匹配数据并传达缓冲区中匹配开始的位置以及持续的时间来表示。
  • 如果我们确定一组数值只会上升,而不会下降,则可以对数据进行预处理,将每个值更改为比前一个值大多少。 这通常会将数据转换为某些值比其他值更可能出现的形式。

最简单的压缩方法之一是游程长度编码(RLE)。

假设您的图片背景为纯蓝色。 对于每行像素,而不是将“蓝色,蓝色,蓝色,……蓝色等”存储1000次,您只需存储“ 1000,蓝色”即可节省空间。 解码图像时,算法会读取它并说:“哦,它需要蓝色一千次。没问题。”

对于其他颜色的行,它可能看起来像:“ 36,蓝色,73,红色,42,洋红色,5,绿色,86,灰色……”这仍然比存储每个像素值更好。 因此,这样做可以减少存储图像信息所需的字节数。 当然,颜色是用数字而不是文字存储的,但是您可以理解。

这是无损压缩的一个示例。 这是因为您可以在解码过程中提取准确的图像。 也就是说,您根本不会丢失任何信息。 这不仅适用于图像,还可以用于压缩任何文件。

还有一种有损压缩,可以丢弃信息并且仍然可以接受。 想想云的图像。 将图像分割成8×8的微小块,您会发现其中一些可以通过渐变近似,并且可以简单地存储为两种颜色和一个方向。 不能精确地重建真实图像,但是结果是人眼可以接受的,因此减少数据大小是值得的。

音乐也可以通过有损压缩来压缩,并且仍然可以被耳朵接受。 但是其他类型的数据不能承受丢失任何信息的风险。 需要精确地构建计算机程序,否则该程序将运行奇怪的命令并导致系统崩溃。

压缩很重要,因为它不仅占用更少的内存和磁盘空间,而且还可以更快地跨通信通道进行传输。 例如,图像,声音和其他数据压缩得越多,网页加载的速度就越快。

对于需要无损压缩的文件,常用技术类似于Lempel-Ziv-Welch(LZW)算法,该算法在文件中查找字符的重复序列,并将其替换为更短的位序列。 同时,用什么短位模式对应什么长序列来构造字典。 此过程反复遍历文件,并自适应地构建文件可以优化的最优化的缩短序列集,以便可以逆转该过程以以其精确形式重建原始数据。 压缩程度与可以发现多少个重复序列以及它们有多长直接相关。 因此,某些类型的文件比其他类型的文件更适合无损压缩。

对于允许有损压缩的文件(例如照片,音乐和视频),使用了不同的算法,这些算法考虑了人类的感知模型,因此重建的数据不是原始数据的数学精确副本。 但是,使用良好的算法,某些原始数据的丢失是原始版本的合理版本,因此最终的重构仍然为用户所接受。 这是因为该算法只能删除有助于减少数据感知方面的数据(例如,音频中的较安静的频带在感知上被更大声且更突出的频带所掩盖)。在这种算法中,通常可以提高重建质量通过以更高的质量交换较低程度的数据丢失(并因此降低压缩效率)。 但是,“可接受性”是一种固有的主观度量,有些人发现有损算法的结果在结果文件的特定最大允许大小/比特率上是令人反感的,而其他人在相同设置下可能几乎没有差别。

也许文件(以位和字节为单位)看起来像这样:

01100100110100101100000100111010110101100100 …

您看到上面的“ 011”模式再次出现了六次吗? 也许我每次看到“ 011”时都用字母“ A”代替,以节省一些空间。

所以现在我的模式如下:

A0010A01001A0000010A101A01A00100…

看到? 我只是潜在地保存(压缩)了12个插槽-将18个插槽变成了6个插槽。 我的样本文件现在大约是以前的大小的73%(原始文件中的32个)。 是的,当我需要“解压缩”文件时,我需要几秒钟的时间来重新查找并替换“ 011”来代替每个“ A”,但这就是时空的权衡当您开始压缩事物时,您会做出。

真正的压缩机制要复杂一些(前缀编码等,需要确保没有人将“ 011”与“ 01”混淆并替换错误)—此外,现代压缩算法使用长树结构,甚至使用看起来有点像奥林匹克五环的怪异的重叠五圆图,但该示例有望传达总体思路。

假设我们使用的文件系统为每个字符/数字占用一个单位的内存。

如果您的文件包含以下内容:

0000000000

它将占用10个单位的内存。 压缩算法将尝试以一种有意义的形式(不丢失任何含义)来表示它,同时将尝试节省内存。 它是通过查找文件内容的简短描述来实现的。

一种可能的压缩方式是将文件描述为

10个零

这需要8个单位的内存(包括空间)。

一个更聪明的算法将使用更少的空间来描述它:

10:0

开发人员将算法描述为的位置。

重要的是要记住,算法的设计方式必须使我们能够解压缩以获取原始内容。

“运行长度加密”或“运行长度压缩”是最早向计算机科学专业教授的压缩算法之一。

就像上面的示例算法一样,通过简单地计数字符来进行压缩。 例如,包含序列aaabbcddddef的文件将被压缩为a3b2cd4ef。

好的运行长度加密算法将检查压缩序列是否比原始序列短,并且仅在满足该条件时才进行压缩。


稍微多于外行的解释:

压缩之所以起作用,是因为幸运的是,大多数数据都是稀疏的。 我的意思是,大多数数据是噪声/冗余的。 想象我们处于一个二进制世界,其中1表示存在,0表示不存在,在这种情况下,您会发现0大于1。

还可以看一下Kolmogorov复杂度,它是信息论的基础主题之一,该话题讨论的是在使字符串保持压缩还是使其原始表示之间更好之间进行选择。

基本上有两种压缩算法…
1.无损
2.有损。
顾名思义,在无损压缩中,解压缩后的数据不会丢失其细节。 另一方面,有损算法往往会漏掉所涉及数据的次要细节。

现在,从编码角度来看,除了使用DCT和MDCT之类的正弦波格式外,我们还有许多算法倾向于利用统计冗余来进行压缩。

我们知道颜色上的细微差异比亮度上的变化更难感知。视频或帧中的图片使用像素表示。 这些像素依次以1’和0’s的形式存储(可能是数据中正弦波的公共频率等)。 在有损算法中进行权衡是要操纵数据中的这些小差异。

进一步参考:-数据压缩

假设您想把衣服装进包里。 第一次尝试时,您尝试将所有衣服塞进包中,然后发现有些衣服遗漏了。 然后,您的一个朋友走过去,将每件衣服折叠起来,现在袋子里放着更多的衣服。 第三位朋友看着您的书包,并说与其他朋友相比,他有更好的方法来讨价还价。 尝试一下后,您会发现现在装进袋子的衣服比以前更多了。

数据压缩与以上情形非常相似。 它可以更好地折叠或表示数据,以便更多数据适合给定空间或给定数量的数据占用的空间比所需的少得多。

考虑一个简单的算法,例如RLE或游程长度编码。 让我们假设比初始数据是

AAAAABBBBBCCCCCCC

现在,RLE的工作原理是用字符及其游程长度替换字符游程。 所以现在应用这个我们得到

A5B5C5

它比原始字符串小得多。 同样,有几种算法,例如算术编码,Lempel-Ziv等,可以更好地表示数据,从而减小了初始数据的大小。 通常,诸如winzip之类的软件使用一种或多种此类算法的组合来压缩数据

压缩以不同的方式工作,并不总是将其简单地定义为单词“压缩”。

例如,最常见的压缩方式之一是使用简单的逻辑,例如,如果您尝试压缩以简单布局作为背景拍摄的图片,则图像会简单地存储为像素数x背景颜色。

现在,当您对图像进行解压缩时,将执行相同的计算以还原您的图像,而不会造成任何损失,而且毫无意义,它可以完美地工作。 称为游程长度编码的策略通常在大多数压缩应用程序中使用。


除了许多人想了解更多有关无损和有损作为压缩手段和技术的知识外,两者实际上都不错,但是应用程序可能相差很大,但是这两者都是包括WhatsApp和社交媒体巨头Facebook在内的大多数聊天平台上使用的领先压缩技术之一。 。

有关有损和无损的其他阅读:

帕拉尼·库玛(Palani Kumar)对诸如WhatsApp和BBM等信使压缩图像使用的技术/算法是什么?

我假设您正在谈论无损压缩,即在压缩和解压缩过程之后,数据将像以前一样被恢复到精确的字节流中。 最著名的软件将基于LZ的算法与熵编码算法结合在一起。 最初的LZ77算法非常简单,但是程序员做出了许多变体,并在实现中使用了许多技巧。

以下是一些使用关键字的算法:

7-zip(LZMA):LZ77 +范围编码,具有散列链或二进制树匹配查找器,最佳解析,用于范围编码器的FSM上下文模式,可执行文件上的BCJ / BCJ2预处理器。

邮编/ gzip /放气:LZ77,字典大小为32KB +哈夫曼编码

RAR所有版本:LZ77 + Huffman编码,更大的窗口大小。

Bzip2:BWT(又名块排序)+ MTF +霍夫曼编码

LZ4 / LZF / Snappy / LZO / QuickLZ:都是LZ77的变体。

所有这些最初都是用C编写的。由于数据压缩着重于性能,我认为C应该是最佳选择。

压缩文本通常是通过使用最短的位字符串编码常用的字母(例如英语的“ e”)并使用剩余的较长字符串编码较少使用的字母来完成的。

我将在不涉及技术细节的情况下对此进行解释。

假设有一个1字节的文件。 该文件将以二进制格式存储在计算机内部。
假设文件内部数据的二进制表示形式由以下8位(1个字节)给出:11110000。给定的位是4-1s和4-0s。 不仅要保存11110000,我们还要保存4-1和4-0,这将占用更少的空间。

您可以在此处阅读有关数据压缩及其算法的更多信息。

http://en.m.wikipedia.org/wiki/D…

根据我的阅读,我相信压缩文件包括在字符中查找模式,然后替换为较小的内容。

例如,假设您要压缩1000个字符的word文档。 压缩算法将搜索文件,并跟踪找到的每个单词。 当遇到一个单词时,它会一直跟踪,而不是一直跟踪同一单词,它可能会引用前一个单词,然后指向找到的重复项的位置。 重复此过程,最终将得到一个较小的文档。
此过程也适用于字符级别,因此每个重复的字母都会
对字母的初始实例的引用。 当然,这比节省单词级别节省了很多,减少了文件的整体大小。
博闻网如何进行文件压缩这是一篇很棒的文章,介绍了该过程。

文件压缩是一种用于减小文件大小而不影响其数据质量的技术。 压缩有多种类型,具体取决于我们要压缩的文件类型。 最常见的是图像压缩,特别是在网站上使用时。 当我们从高分辨率相机上拍摄图像时,图像大小约为MB,这对于网站而言不是一件好事,因为加载如此重的图像需要花费较长时间。

图像压缩的工作原理–算法获取数据流(具有相同值的连续数据元素)并将其存储在单个数据值和计数中。 它最适用于简单图形文件,其中长期运行相同的数据元素。

有几种在线图像压缩工具,如Tinypng。 如果您正在使用Wordpess网站,那么您会很幸运,因为您有许多适用于WordPress的图像压缩插件。