1

我只调整大于规定尺寸的图像,如下所示:

<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,200 像素 × 800 像素 @ 192.3KB: 原始图像

调整后的图像 670px × 447px @ 238.3KB: 调整大小的图像

4

1 回答 1

2

TLDR

JPEG本质上具有伪影。压缩图像通常会产生伪影。两者都做会产生很多工件。保存图像时,大量空间用于对伪像进行编码。


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

拿你的图像,而不是处理 1x1 像素,考虑一个 8 x 8 块。与原始像素相比,在左上角使单个像素完美。至于其他 63 个,创建一个数学近似值(参见:https ://en.wikipedia.org/wiki/Discrete_cosine_transform )。根据您想要多少细节,剩余的 63 位中越来越多的将完全正确,而不是关闭。

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


现在让我们看看你做了什么。您拍摄并成像,它被扩展为 1365 x 768。这种扩展并没有创造出完美的图像。一些像素已关闭,因为这就是 JPEG 的工作方式。

当您将其分解时,它不是数学的一半。这意味着生成的像素。单个像素不是 4 个像素(插值)的平均值。所以你现在平均了很多像素。请记住,实际上只有 1 分之 64 是正确的。

创建一个新图像。它还有一个 8 x 8 块。但它的 8 x 8 块也有来自原始编码和插值的噪声。编码器不知道什么是预期图像的一部分,什么是噪声。因此,它想要对所有图像进行编码,以便准确地表示它所传递的内容。编码所有这些噪音会占用空间。

于 2019-09-19T19:03:38.910 回答