Изменить размер изображения и сохранить качество? - PullRequest
0 голосов
/ 03 января 2011

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

В результате вы загружаете файл, размер которого превышает указанные параметры, изображение обрезается, а затем сохраняется с качеством 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 ]

5 голосов
/ 03 января 2011

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

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

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

2 голосов
/ 03 января 2011

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

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

0 голосов
/ 03 января 2011

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

...