Изменить размер изображения и сохранить качество?

У меня проблема с изменением размеров изображений.

Что происходит, если вы загружаете файл, размер которого превышает указанные параметры, изображение обрезается, а затем сохраняется со 100% качеством.

Так что, если я загружу большой JPEG, который 272Kb. Изображение обрезается на 100 нечетных пикселей. Размер файла увеличивается до 1,2 МБ.

Мы сохраняем изображения со 100% качеством. Я предполагаю, что это является причиной проблемы. Изображение экспортируется из Photoshop с качеством 30%, что уменьшает размер файла. Сохранение изображения с качеством 100% создает такое же изображение, но я предполагаю, что с большим количеством избыточных данных файла.

Кто-нибудь сталкивался с этим раньше? у кого-нибудь есть решение?

Это то, что мы используем.

$source_im = imagecreatefromjpeg ($file);
$dest_im = imagecreatetruecolor ($newsize_x, $newsize_y);
imagecopyresampled (
    $dest_im, $source_im,
    0, 0,
    $offset_x, $offset_y,
    $newsize_x, $newsize_y,
    $sourceWidth, $sourceHeight
);

imagedestroy ($source_im);
if ($greyscale) {
    $dest_im = $this->imageconvertgreyscale ($dest_im);
}
imagejpeg($dest_im, $save_to_file, $quality);
break;

3 ответа

Решение

Экономия на уровне 30%, а затем повторная экономия на уровне 100%, как вы говорите, создадут избыточные данные, будь то обрезка, изменение размера или что-либо еще.

К сожалению, сжатие JPEG накапливает потерю данных, поэтому сжатие на 30%, обработка изображения, а затем повторное сжатие всегда будут выглядеть хуже, чем исходное сжатие. Основное правило - избегать сжатия (особенно сильного сжатия, например, 30%) до тех пор, пока процесс не станет настолько поздним, насколько это возможно. Поэтому загрузите на 100% (или на 80%, если необходимо), затем сожмите.

Редактировать: по- видимому, jpegtran (google it) может выполнять такие операции, как обрезка, без предварительного распаковывания изображения, если размер изображения соответствует определенным ограничениям (обычно ширина и высота кратны 16 пикселям). Сам не пробовал, но это может подойти вашим целям.

При сохранении JPEG с качеством 30% большая часть информации о пикселях не сохраняется. При повторном открытии с помощью gd создается новое изображение с четкими новыми пикселями. Хорошо это или плохо для вас (в зависимости от качества, с которого изображение было изначально сохранено) не имеет значения. При сохранении этого нового изображения вы создаете новый файл JPEG. Установка качества на 100% в основном сэкономит каждый пиксель, что, конечно, занимает много места. (Я обобщаю, но вы поняли.) Какая бы ни была настройка качества, при которой был сохранен оригинал, не имеет значения, сохранение большого изображения со 100% качеством занимает много места.

Единственное решение - сохранить изображение с использованием более низкого качества; обычно что-то около 70% практически неотличимо от идеального, но экономит много байтов. Вы также можете попробовать PNG, который без потерь, но может (или не может) обеспечить лучшую степень сжатия.

Ваши предположения верны, вы по сути сохраняете их без потерь. Я столкнулся с этим с кодированием видео, где я уменьшил бы разрешение, но увеличил его до без потерь, и окончательный размер был в два раза больше, чем оригинал. Если это достаточно маленькое изображение, я бы сохранил его, используя хороший тип изображения, основанный на палитре, или тип, который является естественным без потерь, а не JPEG. Либо это сохранит его с качеством 50-70% и позволит jpeg делать то, что у него хорошо получается.

Другие вопросы по тегам