当前位置: 首页 > 知识库问答 >
问题:

图像压缩

寿子默
2023-03-14

我一直在计算图像的未压缩和压缩文件大小。这对我来说总是导致压缩图像比我预期的未压缩图像小。如果图像包含大量不同的颜色,则存储调色板会占用大量空间,还需要更多位来存储每个代码。然而,我的问题是,压缩方法是否可能导致比未压缩的RGB图像更大的文件。对于这种压缩方法仍然有用的、总共包含k种不同颜色的最小正方形RGB图像,其大小(像素)是多少?因此,我们想要找到,对于给定的k值,找到最小整数n,对于该整数,大小为n×n的图像在压缩后比原始RGB图像占用更少的存储空间。

共有2个答案

翁阳曜
2023-03-14

一般来说没有,但你的问题不准确。

如果我们压缩普通文件,它们可能会更大。例如,如果您压缩随机生成的字节序列,则没有太多要压缩的,因此您会得到压缩程序的标头,它告诉您使用了哪种压缩方法,以及一些版本控制。这将放大文件,甚至。一些转义。好的压缩程序会看到压缩不会缩小大小,因此他们不应该压缩,并在标头中告诉它是一个平面文件。这可能是按程序区域完成的。

但是你的问题是关于图像的。压缩是在文件内部完成的,通常不是所有文件,而是图像位。在这种情况下,程序会看到不需要压缩,所以他们会保持文件未压缩。但是因为图像标题总是存在,所以这只改变了一个标志,所以没有增加大小。

但这也可能取决于文件格式。你写过关于“调色板”的文章,但现在很少使用:压缩是在文件中找到类似的模式。不过,这取决于图像格式。如果你在维基百科中查找特定的文件格式,你可能会看到一个带有标题参数的表格(例如位深度或颜色数(调色板)、颜色定义和压缩方法)。

然后,对于类似调色板的图像,Dan Mašek的答案是(https://stackoverflow.com/a/58683948/2758823)有一些很好的数学解释,但人们不应该忘记,压缩是非常有启发性的,并且是对真实示例的测试:真实图像有模式。

宗政唯
2023-03-14

让我们先做一个小的简化——编码输出的大小取决于像素的数量(宽度与高度的实际比例并不重要)。因此,让我们将问题推广到像素数N,从中我们可以通过平方根计算N。

为了进一步简化问题,我们还将忽略任何图像头/元数据的开销,例如宽度、高度、调色板的大小等。在实践中,这通常是一些相对较小的常数。

考虑到我们有

  • N表示图像中的像素数

我们的目标是解决以下不等式

就N。

RGB图像只是N个像素的数组,每个像素占用RGB编码给定的固定位数。因此,

调色板图像由两部分组成:调色板和像素。

调色板是k种颜色的数组,每种颜色占用RGB编码给出的固定位数。因此,

在这种情况下,每个像素持有调色板条目的索引,而不是实际的RGB颜色。表示k值所需的位数为

然而,除非我们可以对分数位进行编码(我认为这超出了这个问题的范围),否则我们需要对其进行取整。因此,编码调色板索引所需的位数为

由于存在N个这样的调色板索引,因此像素数据的大小为

调色板图像的总大小为

而最后

在Python中,我们可以用以下方式表示:

import math

def limit_size(k):
    return (k * 24.) / (24. - math.ceil(math.log(k, 2)))

def size_rgb(N):
    return (N * 24.)

def size_pal(N, k):
    return (N * math.ceil(math.log(k, 2))) + (k * 24.)
 类似资料:
  • 问题内容: 我正在通过wifi或移动网络通过网络发送图像,以将其存储在服务器中并再次检索。我已经这样做了,但是由于相机拍摄的图像太大,这使我的应用程序变慢,只是要指出我正在打开图库并从那里拍摄照片,而不是直接从应用程序拍摄照片。我注意到,从相机和图库中获取的来自whatsapp的图像已被压缩到大约50%。100kb。 目前,我的代码获取一个文件,并将其转换为字节,然后发送。这是获取文件并将其转换为

  • 我正在使用Python的Pillow库来读取图像文件。如何使用哈夫曼编码进行压缩和解压缩?以下是说明: 您已经获得了一组示例图像,您的目标是在不丢失任何可感知信息的情况下尽可能压缩它们——解压后,它们应该看起来与原始图像相同。图像本质上存储为一系列颜色点,其中每个点表示为红色、绿色和蓝色(rgb)的组合。rgb值的每个分量范围在0-255之间,因此例如:(100, 0, 200)表示紫色。使用固定

  • 我想上传图像到服务器。将我的图像转换为位图,但仍然出错。位图太大,无法上传到纹理中 如果我得到图片使用画廊意味着我得到错误的位图太大,不能上传到纹理 如果我得到图片使用相机意味着得到错误的 造成:java.lang.安全例外:权限拒绝:阅读<-plhd--1/>MediaProvider uri内容://media/外部/图像/媒体从pid=18253,uid=10257需要android.per

  • 对于我的图像压缩,我使用枕头库获得rgb中的每个像素(例如:(100,0200)。使用哈夫曼编码,我已经将其转换为二进制,以减少比特数。现在,我必须将位序列保存到文本或二进制文件中。压缩文件始终比原始文件小,但目前,我的txt文件比原始文件大。我该怎么办?在那之后,我如何读取文件并解压缩它。以下是说明: 您的代码应该读取图像文件,计算固定长度编码需要多少位,然后应用压缩算法创建较小的编码-您需要实

  • 从pagespeed中,我只获得了图像链接和可能的优化(以字节为单位) 例如,我有大小为300kb的图像,对于该图像,pagespeed显示100kb 这只是一个图像,但我相信我会有很多图像压缩。所以,我如何通过传递字节或百分比作为参数或使用java中的任何其他计算(通过使用API或图像处理工具)来压缩图像,以便获得google建议的图像压缩版本。 提前谢谢。

  • 使用blockproc和Cosinus离散变换(