Страница 1 из 1

Оптимизация изображений

Добавлено: 15.02.2017, 16:18
andrij
Для поисковиков очень важен фактор скорости загрузки страници

Когда движок обрезает картинки товара то они очень не оптимизировани


jpegtran optimize JPEG images
optipng lossless PNG optimization
pngquant lossy PNG optimization

Как можно прикрутить єтот софт к движку

Добавлено: 16.02.2017, 08:15
m1hasik
andrij писал(а):Для поисковиков очень важен фактор скорости загрузки страници

Когда движок обрезает картинки товара то они очень не оптимизировани


jpegtran optimize JPEG images
optipng lossless PNG optimization
pngquant lossy PNG optimization

Как можно прикрутить єтот софт к движку

Точно не скажу, но часть того что вы написали это библиотеки хотсинга а не cms, так что врядли можно будет прикрутить это к сайту с одной стороны

P/S еще, в функции при ресайзе можно указать вот такой параметр
$thumb->setImageCompressionQuality(60);
это качество изображений, который нарезаются
100 - наилучшее
0 - наихудшее
по умолчанию на хостингах стоит примерно 80-95

Добавлено: 03.03.2018, 08:10
therion.kiev
Вопрос древний, как и решение. Оставлю здесь:
1) правим скрипт resize/resize.php

Код: Выделить всё

<?php

require_once('../api/Okay.php');

$filename = $_GET['file'];
$token = $_GET['token'];

$okay = new Okay();

/*Принимаем нужную сущность для ресаза её изображения*/
$original_img_dir = null;
$resized_img_dir = null;
if (isset($_GET['object']) && !empty($_GET['object'])) {
    //$_GET['object'] - по сути папка с нарезанными картинками
    if ($_GET['object'] == 'blog_resized') {
        $original_img_dir = $okay->config->original_blog_dir;
        $resized_img_dir = $okay->config->resized_blog_dir;
    }
    if ($_GET['object'] == 'brands_resized') {
        $original_img_dir = $okay->config->original_brands_dir;
        $resized_img_dir = $okay->config->resized_brands_dir;
    }
    if ($_GET['object'] == 'categories_resized') {
        $original_img_dir = $okay->config->original_categories_dir;
        $resized_img_dir = $okay->config->resized_categories_dir;
    }
    if ($_GET['object'] == 'deliveries_resized') {
        $original_img_dir = $okay->config->original_deliveries_dir;
        $resized_img_dir = $okay->config->resized_deliveries_dir;
    }
    if ($_GET['object'] == 'payments_resized') {
        $original_img_dir = $okay->config->original_payments_dir;
        $resized_img_dir = $okay->config->resized_payments_dir;
    }

}

$resized_filename =  $okay->image->resize($filename, $original_img_dir, $resized_img_dir);
if(is_readable($resized_filename)) {

    $mimeType = image_type_to_mime_type(exif_imagetype($resized_filename));
   
   if ($mimeType == '   image/png') {
        header('Content-type: ' . $mimeType);
      $output = shell_exec("/home/therion/alva.kiev.ua/www/resize/optipng -o7 -strip all ".escapeshellarg($resized_filename));
        print file_get_contents($resized_filename);
   }
   
   if ($mimeType == 'image/jpeg') {
        header('Content-type: ' . $mimeType);
      $output = shell_exec("/home/therion/alva.kiev.ua/www/resize/jpegoptim --max=75 --strip-all --preserve --totals ".escapeshellarg($resized_filename));
        print file_get_contents($resized_filename);
   }

    header('Content-type: image');
    print file_get_contents($resized_filename);
}


2) в папку resize/ ложим бинарники jpegoptim и optipng (у меня на хостинге RHEL x64, скомпилил сам с исходников)
3) Готово

П.С: для RHEL x64 (Fedora,Centos) скачать бинарники можно тут: https://mega.nz/#!jIlERSJR!Qp3-jMOPmPsb2bd0CJDY9ywNcPHSVp7f2GoNO_mYhq4

Добавлено: 13.04.2018, 12:49
NotSlow
therion.kiev, спасибо конечно что пытаетесь помочь.
Но без подробного описания это больше медвежья услуга... :)

Люди просто копипастят себе что-то из интернета, совершенно не понимая что происходит.

Как минимум стоило бы указать что путь /home/therion/alva.kiev.ua/www/ у каждого свой и стоит поправить, а не тупо передирать.

Плюс в чем сложность попросить хостера установить эти самые jpegoptim и optipng?
Это совершенно не проблема в большинстве случаев и ни к чему заливать свои бинарники, которые еще и далеко не у всех запустятся.

Вдобавок, возможно у вас отключены warning'и в php, но у кого-то может нет и логи будут изобиловать сообщениями типа "PHP Warning: Cannot modify header information".
А все потому что, смотрим что происходит:

Проверка есть ли доступ к фотке

Код: Выделить всё

if(is_readable($resized_filename)) {

И внутри этого условия:

Получаем mine тип файла.

Код: Выделить всё

$mimeType = image_type_to_mime_type(exif_imagetype($resized_filename));

И дальше 2 раза сравниваем, а не png или jpeg ли у нас файлик часом.

Код: Выделить всё

if ($mimeType == '   image/png') {
if ($mimeType == 'image/jpeg') {

Сразу вопрос - почему у вас перед image/png 3 пробела?

Если совпадает с png или jpeg, то внутри соответствующего условия оно во-первых шлет заголовок header('Content-type: ' . $mimeType), а дальше прогоняет через optipng или jpegoptim.
Ладно, но зачем потом еще раз шлется заголовок header('Content-type: image') ?
И, жесть, еще раз print file_get_contents($resized_filename)
Это и вызывает предупреждение в логах из-за двойного заголовка. И главное - само содержание фотки передается в двух экземплярах друг за другом.
Браузеры конечно достаточно разумные чтоб показать правильно, но это же бред...

короче правильней так:

Код: Выделить всё

if(is_readable($resized_filename)) {

        $mimeType = image_type_to_mime_type(exif_imagetype($resized_filename));

        header('Content-type: ' . $mimeType);
        if ($mimeType == 'image/png') {
                $output = shell_exec("optipng -o7 -strip all ".escapeshellarg($resized_filename));
        }
        elseif ($mimeType == 'image/jpeg') {
                $output = shell_exec("jpegoptim --max=75 --strip-all --preserve --totals ".escapeshellarg($resized_filename));
        }
        print file_get_contents($resized_filename);
}

Обращаю внимание что остальную часть resize.php не трогаем.
Правим только то, что начинается с if(is_readable($resized_filename)) {

И обращаю внимание на:
shell_exec("optipng...
shell_exec("jpegoptim...
Если в логах будет ошибка что мол нет такого, то просим хостера поставить.
Ну или в крайнем случае все же пробуем закинуть свои бинарники и указываем тут полный правильный путь к ним.