Есть ли качество, размер файла или другие преимущества для форматов JPEG, кратных 8px или 16px?
Процесс кодирования сжатия JPEG разделяет данное изображение на блоки размером 8x8 пикселей, работая с этими блоками в будущих сжатиях с потерями и без потерь. [источник]
Также упоминается, что если изображение представляет собой множественный блок 1MCU (определенный как минимальная кодированная единица, "обычно 16 пикселей в обоих направлениях"), то могут быть выполнены изменения JPEG без потерь. [источник]
Я работаю с изображениями продуктов и хотел бы знать, как и сколько преимуществ можно получить, используя кратные 16 в моем конечном размере изображения (скажем, используя изображение размером 480 на 360 пикселей) по сравнению с не кратным 16 (например, 484x362). В этом примере меня не интересуют дальнейшие изменения, редактирование или повторное сжатие конечного изображения.
Чтобы попытаться приблизиться к конкретному ответу, где, как я знаю, должно быть много общих черт: учитывая изображение размером 480x360, которое составляет 64 КБ и сохранено с максимальным качеством в Photoshop [пример]:
- Можно ли ожидать потери качества изображения 484х362?
- Какой размер файла может быть добавлен (в этом примере дополнительным пространством будут белые пиксели)
- Есть ли какие-либо иные недостатки, чтобы расти больше, чем сетка 8px?
Я знаю, что использовать этот конкретный пример произвольно, но было бы полезно (для меня и, возможно, для всех, кто размышляет над размером изображения) понять, с каким уровнем компромисса я буду иметь дело, разбивая сетку не-8px.
Ключевым вопросом здесь является дискуссия, состоящая в том, являются ли делимые на 8 пикселей изображения более высокого качества, чем изображения, которые не делятся на 8 пикселей.
5 ответов
8 пикселей это отсечка. Причина в том, что изображения JPEG - это просто массив блоков DCT 8x8; если разрешение изображения не mod8 в обоих направлениях, кодировщик должен заполнить стороны до следующего разрешения mod8. На практике это не очень дорого; что гораздо хуже, это случаи, когда изображение имеет четкие черные линии (например, изображение в виде почтового ящика), которые не лежат на границах блоков. Это особенно проблематично при кодировании видео. Причиной этой проблемы является то, что частотное преобразование резкой линии представляет собой гауссово распределение коэффициентов, что приводит к огромному количеству битов для кодирования.
Для любопытных наиболее распространенным методом заполнения краев при внутреннем сжатии (например, изображения JPEG) является зеркальное отображение линий пикселей перед краем. Например, если вам нужно заполнить три линии, а линия X- это край, линия X+1 равна строке X, строка X+2 - строке X-1, а строка X+3 - строке X-. 2. Это довольно эффективно минимизирует стоимость в коэффициентах преобразования дополнительных строк.
Однако при интеркодировании алгоритмы заполнения обычно просто дублируют последнюю строку, потому что метод зеркалирования не работает хорошо для интер-сжатия, такого как сжатие видео.
Иногда вам нужно использовать 16 пикселей, а не 8 из-за подвыборки; каждый 2-й пиксель отбрасывается во время процесса кодирования, и эти блоки DCT 8x8 начинаются как 16x16 и декодируются обратно в 16x16. Это не будет проблемой при настройках высочайшего качества.
JPG с размерами, умноженными на 8, также можно поворачивать / переворачивать без потери качества. Например, gthumb может сделать это в Linux.
Размеры изображения, кратные 8 или 16, не сильно повлияют на размер диска, но вы можете существенно сэкономить, если выровняете визуальное содержимое с сеткой 8x8 пикселей, например, если есть повторяющийся шаблон или Текстура на изображении.
Что сказал Томецкий. Если у вас нет правильного кратного числа, алгоритмы без потерь и переворота не работают. Это происходит потому, что отступы справа / снизу, которые можно безопасно игнорировать, теперь заканчиваются слева / сверху, где это невозможно.