Создание образа с помощью PHP - Большой размер файла

Эта проблема

Я пытаюсь изменить размер 260x310px PNG до 120x120px, сохраняя при этом прозрачность и центрируя изображение. Я включил функцию, которую я использую ниже, она отлично работает с точки зрения внешнего вида изображения, однако созданные изображения намного больше. На самом деле все изображения имеют размер 128 КБ (их тысячи, я не просматривал их все), а каталог из 50 000 этих изображений на 1 ГБ больше, несмотря на то, что изображения имеют более половины размера (в пикселях).

Я предполагаю, что это потому, что PHP не выполняет никакой оптимизации, как это может сказать Photoshop. Есть ли что-нибудь, что я могу сделать, чтобы оптимизировать изображение в PHP?

Код

Это мой код:

if ($handle = opendir($mydir_path)) {
    while (false !== ($entry = readdir($handle))) {
        if(strpos($entry, '.png'))
        {
            resize($mydir_path.$entry);
        }
    }
    closedir($handle);
}

function resize($img_loc)
{
    $mini_loc = str_replace('megapack', 'handheld_megapack', $img_loc);

    $canvas = imagecreatetruecolor(310, 310);
    imagefill($canvas, 0, 0, imagecolorallocatealpha($canvas, 255, 255, 255, 127));
    imagealphablending($canvas, false);
    imagesavealpha($canvas, true);

    $img = imagecreatefrompng($img_loc);
    imagecopy($canvas, $img, 25, 0, 0, 0, 260, 310);

    $resizedImg = imagecreatetruecolor('120', '120');
    imagefill($resizedImg, 0, 0, imagecolorallocatealpha($resizedImg, 255, 255, 255, 127));
    imagealphablending($resizedImg, false);
    imagesavealpha($resizedImg, true);

    imagecopyresampled($resizedImg, $canvas, 0, 0, 0, 0, '120', '120', '310', '310');

    $dirname = dirname($mini_loc);

    imagepng($resizedImg, $mini_loc, '0');

    chmod($mini_loc, 0666);

    return $mini_loc;
}

person John Mellor    schedule 23.12.2012    source источник


Ответы (1)


Хотя с помощью PHP можно оптимизировать файл, проще всего запустить его с помощью такой программы, как pngcrush. .

С GD вы можете попробовать использовать третий параметр imagepng "качество" и установить его на 9 (у вас установлено до 0 = без сжатия), но вы получите гораздо больше со специализированным оптимизатором PNG.

Также проверьте этот вопрос: инструменты оптимизации PNG

person akirk    schedule 23.12.2012
comment
Я смотрел на pngcrush, и это может быть решением. Я дам вам +1, но, надеюсь, кто-то даст некоторое представление об оптимизации изображений, сгенерированных PHP :) - person John Mellor; 24.12.2012
comment
Спасибо, я немного расширил свой ответ. - person akirk; 24.12.2012
comment
О, черт возьми, это кажется таким очевидным! Это значительно уменьшило размер файла до 20 КБ без заметной потери качества. - person John Mellor; 24.12.2012
comment
Также после использования pngcrush на изображении с оптимизацией 9 впоследствии было сохранено менее 1 КБ, поэтому кажется, что оптимизации 9 достаточно - person John Mellor; 24.12.2012
comment
Ага сделал 3гб дир 1гб без явной потери качества. Ответ был настолько очевиден, что я немного смутился! - person John Mellor; 24.12.2012