Почему изменение размера изображения меньше исходного приводит к увеличению размера файла? - PullRequest
1 голос
/ 19 сентября 2019

Я изменяю размеры изображений только там, где они больше, чем предписанный размер, например:

<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>

Исходное изображение, которое я загрузил для тестирования, было 1365px × 768px и размер файла 36.4KB.Но как только его размер был изменен до 670px x 377px, он заканчивается размером файла 89,5 КБ.

Почему увеличивается размер файла, когда изображение на самом деле меньше?Есть ли способ сказать ColdFusion, что он ничего не должен делать с изображением, кроме как просто сделать его меньше?

ОРИГИНАЛЬНОЕ ИЗОБРАЖЕНИЕ 1 200px × 800px @ 192.3KB: ORIGINAL IMAGE

ИЗМЕНЕННОЕ ИЗОБРАЖЕНИЕ 670px × 447px @ 238,3 КБ: RESIZED IMAGE

1 Ответ

2 голосов
/ 19 сентября 2019

TLDR

JPEG по своей природе имеет артефакты.Сжатие изображения в целом создает артефакты.Выполнение обоих делает много артефактов.Когда вы сохранили изображение, для кодирования артефактов использовалось много места.


Полная история длинная, но позвольте мне привести наполовину запеченную версию.Изображения JPEG являются растровыми изображениями, но они не являются точной копией исходной растровой карты.Так что же это такое?

Возьмите свое изображение, и вместо того, чтобы иметь дело с пикселями 1x1, рассмотрите блок 8 x 8.В верхнем левом углу сделайте этот пиксель идеальным по сравнению с оригиналом.Что касается остальных 63, создайте математическое приближение того, что это должно быть (см .: https://en.wikipedia.org/wiki/Discrete_cosine_transform). В зависимости от того, сколько деталей вы хотите, все больше и больше оставшихся 63 битов будут точно правильными, а не близкими.

Теперь, когда все данные сокращены, выполните базовое сжатие без потерь


Теперь давайте посмотрим, что вы сделали. Вы взяли изображение, оно было расширено до 1365 x768. Это расширение не создало идеальное изображение. Некоторые пиксели были отключены, потому что именно так работает JPEG.

Когда вы уменьшали его, это была не математическая половина. Это означает, что получаются пиксели. Aодин пиксель не был средним от того, что было 4 пикселя (интерполяция). Таким образом, вы сейчас усредняете много пикселей. Имейте в виду, что только 1 из 64 был на самом деле правильным.

Создается новое изображение.имеет блок 8 x 8. Но его блок 8 x 8 также имеет шум от исходного кодирования и от интерполяции. Кодер не может знать, что было частью tон ожидал изображения и что такое шум.Следовательно, он хочет закодировать все изображение так, чтобы оно точно представляло то, что было вручено.Кодирование всего этого шума занимает место.

...