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

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

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

Поэтому, если я загружаю большой jpeg размером 272 КБ. Изображение обрезается на 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;

person JasonS    schedule 03.01.2011    source источник


Ответы (3)


Сохранение на 30%, а затем повторное сохранение на 100%, как вы говорите, создаст избыточные данные, независимо от того, обрезаете ли вы, изменяете ли размер, что угодно.

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

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

person Nathan MacInnes    schedule 03.01.2011

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

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

person deceze♦    schedule 03.01.2011

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

person dko    schedule 03.01.2011