为什么调整图像大小小于原始大小会导致文件大小增加?

时间:2019-09-19 18:34:20

标签: coldfusion jpeg coldfusion-2018

我只调整图像大小大于规定大小的图像,例如:

<cfset BodyImgMainW = 670 />
<cfset BodyImgMainH = 670 />
<cfimage name="BodyImg" source="c:\sample_1365x768.jpg"/>

<cfif BodyImg.width GT BodyImgMaxW OR BodyImg.height GT BodyImgMaxH>
    <cfif BodyImg.width GT BodyImgMainW>
      <cfset ImageResize(BodyImg, BodyImgMainW, "", "highestQuality")/>
    <cfelseif BodyImg.height GT BodyImgMainH>
      <cfset ImageResize(BodyImg, "", BodyImgMainH, "highestQuality")/>
    </cfif>
    <cfimage source="#BodyImg#" action="write" destination="C:\sample_670x377.jpg" overwrite="yes" quality="1" format="jpg"/>
</cfif>

我上传用于测试的原始图像为1,365px×768px,文件大小为36.4KB。但是,一旦将其调整为670px x 377px,它最终的文件大小为89.5KB。

为什么实际上图像较小时文件大小会增加?有没有办法告诉ColdFusion除了缩小图像之外不要对图像做任何事情?

原始图像1,200px×800px @ 192.3KB: ORIGINAL IMAGE

缩小的图像670px×447px @ 238.3KB: RESIZED IMAGE

1 个答案:

答案 0 :(得分:2)

TLDR

JPEG本质上具有伪像。通常,压缩图像会产生伪像。两者都做会造成很多假象。保存图像时,大量空间用于编码伪像。


整个故事很长,但让我举一个半熟的版本。 JPEG图像是位图图像,但它们不是原始位图的精确副本。那到底是什么?

带上图像,而不是处理1x1像素,请考虑使用8 x 8的块。与原始像素相比,在左上角使该单个像素完美。至于其他63,则创建应该近似的数学近似值(请参见:https://en.wikipedia.org/wiki/Discrete_cosine_transform)。根据所需的细节量,剩余的63位中的越来越多将是正确的,而不是接近的。

现在所有数据都已减少,请执行一些基本的无损压缩


现在,让我们看看您的工作。您拍摄并拍摄了图像,将其扩展为1365 x768。这种扩展无法创建完美的图像。由于JPEG的工作原理,有些像素处于关闭状态。

当您将其分解时,它不是数学上的一半。表示结果像素。一个像素不是4像素(插值)的平均值。因此,您现在平均很多像素。请记住,实际上只有六十分之一是正确的。

创建新图像。它还具有8 x 8块。但是它的8 x 8块也有来自原始编码和内插的噪声。编码器无法知道预期图像的一部分和噪声。因此,它希望对所有图像进行编码,以使其能够准确表示所处理的图像。对所有这些噪声进行编码会占用空间。

相关问题