Определить степень сжатия JPG?

Обычно, когда изображение попадает на мой сайт, я сохраняю его как jpg, используя созданную мной библиотеку изображений с качеством по умолчанию 80%. Теперь, когда мне нужно выполнить с ним какую-то другую операцию (например, обрезать его или даже просто изменить его размер), изображение будет открыто как jpg, обработано, а затем сохранено обратно. Однако, если он был сжат раньше, я не хочу сжимать его снова, иначе каждый раз, когда мне нужно выполнить операцию, качество будет падать.

Есть ли способ определить, насколько изображение уже было сжато раньше (по сравнению с его версией в формате png, я думаю) с помощью инструментов в стандартных библиотеках GD php? Я знаю, что инструменты, которые определяют, где изображение было отфотошоплено, делают это, сравнивая относительные степени сжатия, поэтому я думаю, что можно определить степень сжатия, но знает ли кто-нибудь, как я буду делать этот расчет? Спасибо.


person hackartist    schedule 17.02.2012    source источник
comment
насколько я знаю, вы не можете получить оценку качества из файла jpg   -  person Eric Yin    schedule 18.02.2012
comment
Я знаю, что он не сохраняется в метаданных самого файла, но, возможно, есть способ его вычислить   -  person hackartist    schedule 18.02.2012
comment
Если у вас есть для этого место, вы можете вместо этого просто сохранить исходный файл (но не публично). Затем, когда вам нужно выполнить дополнительную обработку, вы делаете это с оригиналом, поэтому вам не нужно беспокоиться о том, что постоянное повторное сжатие ухудшит качество вашего изображения.   -  person John Flatness    schedule 18.02.2012
comment
@ Плоскость: Спасибо за идею, я на самом деле делал это изначально, но проблема в том, что со временем я выполняю различные операции (изменение размера, кадрирование, изменение цвета и т. Д.), И мне придется держать версию между ними, или сохранить где-нибудь, какие операции делать с оригинала, чтобы перейти к текущему, и это того не стоило.   -  person hackartist    schedule 18.02.2012


Ответы (4)


Вы не можете получить качественную картинку из JPG. Кроме того, значение качества зависит от кодировщика. Это не стандарт или что-то в этом роде. В некоторых программах только (низкий, средний, высокий), в некоторых 20 может быть лучше 90.

Во-вторых, JPG просто теряет качество при каждой последовательной кодировке, даже если вы каждый раз сохраняете его как лучшее качество. Печальная правда жизни :) Единственные операции, которые не ухудшают качество, - это переворачивание и поворот (и обрезка, если они выровнены по размеру блока JPEG).

Практическое правило: кодируйте его каждый раз с одним и тем же значением качества. Пример: если вы сохраните его один раз, скажем, с 60, то при сохранении с 80 в следующий раз выигрыша не будет. Просто больший размер файла.

Кроме того, попробуйте уменьшить количество таких перекодировок и выполнять каждую операцию с оригиналом, если у вас достаточно свободного места.

person Rok Kralj    schedule 17.02.2012

Вам нужно будет сохранить качество изображения в базе данных, чтобы вы могли знать, было ли оно уже сжато или нет.

person ppp    schedule 17.02.2012
comment
Даже тогда, если он изменит размер изображения, качество упадет. Сохранение бессмысленно. Но, хорошая мысль, значит, есть +1. - person Rok Kralj; 18.02.2012
comment
@RokKralj Предлагаю сохранить, чтобы он не сжимал более одного раза. Он мог еще больше испортить имидж .. - person ppp; 18.02.2012
comment
Вы не все понимаете. Компресса нет, просто экономия по качеству. Если вы имеете в виду, что он сохраняет его один раз на 80, то запомните это, чтобы он мог сохранить его на 100 в следующий раз ...? Это только увеличило бы размер файла без повышения качества. 80 - ›80 -› 80 - правильное сохранение. - person Rok Kralj; 18.02.2012
comment
Нет, я имею в виду, что он может хранить значение 80 и делать что-то вроде if ($ stored_quality ›80) {// выполнять операции И сжимать} else {// выполнять только операции}. Таким образом, единственная потеря качества будет связана с операциями, и он не будет каждый раз снижать качество изображения. Конечно, повышение качества не вариант. - person ppp; 18.02.2012

Чтобы избежать многократного сжатия изображения, вы можете просто сравнить размер файла изменения размера с оригиналом.

  • Если размер файла заметно больше, значит, вы увеличили скорость, поэтому не используйте его.
  • Если он заметно ниже сжатого, используйте его.

Кроме того, повторное сжатие файла с той же скоростью позволяет уменьшить размер файла только на небольшую часть, поэтому если вы используете округленные числа для своих оценок (60%, 70%, 80% и т. Д.), Вы можете определить скорость, если файл изменения размера размер очень похож на оригинал.

Например, сжатие 1,844 KB файла по адресу:
- 90% = 2,115 KB. Размер увеличился, поэтому я не буду его использовать.
- 80% = 1,843 KB. Это почти идентично размеру исходного файла, поэтому я могу предположить, что оригинал имеет рейтинг 80%.
- 70% = 1,567 KB. Это сжато, поэтому я воспользуюсь им.

Наконец, если вас интересует только частота изображений, которые вы сжали самостоятельно, вы можете использовать PHP для сохранения скорости, которую вы используете в метаданных файла.

person nick    schedule 15.01.2017

Фактически вы можете определить качество сжатия изображения JPG с некоторой степенью уверенности, если оно было закодировано только один раз.

Вы можете сделать это с помощью инструмента командной строки под названием identify, который является частью Imagemagick (который также доступен как библиотека PHP, см. Ниже). Вы можете запустить, например:

identify -verbose 11397254.jpg

и вы получите такой результат:

Image: 11397254.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Mime type: image/jpeg
  Class: DirectClass
  Geometry: 600x833+0+0
  Units: Undefined
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Pixels: 499800
    Red:
      min: 7 (0.027451)
      max: 251 (0.984314)
      mean: 205.535 (0.80602)
      standard deviation: 40.8098 (0.160038)
      kurtosis: 7.3041
      skewness: -2.81763
      entropy: 0.627683
    Green:
      min: 4 (0.0156863)
      max: 237 (0.929412)
      mean: 200.186 (0.785044)
      standard deviation: 45.9241 (0.180095)
      kurtosis: 3.86968
      skewness: -2.25667
      entropy: 0.6339
    Blue:
      min: 0 (0)
      max: 241 (0.945098)
      mean: 191.701 (0.75177)
      standard deviation: 54.6716 (0.214399)
      kurtosis: 1.22795
      skewness: -1.70134
      entropy: 0.664107
  Image statistics:
    Overall:
      min: 0 (0)
      max: 251 (0.984314)
      mean: 199.141 (0.780945)
      standard deviation: 47.4814 (0.186202)
      kurtosis: 3.61004
      skewness: -2.23079
      entropy: 0.641896
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Interlace: JPEG
  Intensity: Undefined
  Compose: Over
  Page geometry: 600x833+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: JPEG
  Quality: 100
  Orientation: Undefined
  Properties:
    date:create: 2020-10-28T09:13:49+01:00
    date:modify: 2020-10-28T09:13:45+01:00
    jpeg:colorspace: 2
    jpeg:sampling-factor: 2x2,1x1,1x1
    signature: 7b5dc010915e4ae8b89891f7259a6f22efc69a31e5244403db580b70adc2ee94
  Artifacts:
    filename: 11397254.jpg
    verbose: true
  Tainted: False
  Filesize: 147KB
  Number pixels: 500K
  Pixels per second: 49.98MB
  User time: 0.010u
  Elapsed time: 0:01.010
  Version: ImageMagick 6.9.7-4 Q16 x86_64 20170114 http://www.imagemagick.org

Где важные строки:

  Compression: JPEG
  Quality: 100

Если качество равно 100, это означает, что изображение вообще не было сжато.

Я тестировал этот инструмент на сжатие GIMP JPG, и он очень точно определял процент сжатия, которое я использовал для изображений.

В PHP есть функция в библиотеке ImageMagick:

https://www.php.net/manual/en/imagick.identifyimage.php

Похоже, это портирование того же инструмента, так что вы можете это проверить.

person Paolo Mioni    schedule 28.10.2020
comment
Качество JPG 100 еще не означает сжатие без потерь. (И, конечно, это не означает, что изображение не было сжато; оно все еще значительно меньше, чем эквивалентный файл PNG, не говоря уже о BMP.) Кроме того: да, можно определить качество изображения (identify утилита или редактор изображений, например IrfanView, может отображать его); но до сих пор не ясно, как это сделать программно. - person Mike Rosoft; 25.11.2020
comment
Итак: Утилита ImageMagic identify (или другое программное обеспечение, которое отображает качество изображения) просто оценивает качество, анализируя само изображение. Похоже, что нет объективного определения качества изображения JPG. См. superuser.com/questions/62730. (Это видно из изображений в этом вопросе, для которых IrfanView сообщает о другом, но примерно эквивалентном качестве, чем ImageMagic. Если изображение имеет качество около 100%, но имеет плохие артефакты, это также может означать, что изображение было перекодировано на 100%, включая артефакты JPG.) - person Mike Rosoft; 25.11.2020