Создание миниатюры изображений, эффект Philips Ambilight

Что и говорить, придумал это не я, но так получилось что пришлось слегка доделать данный метод ибо у меня он не работал. Все основано на PHP функции которую предложил aidsoid с небезызвестного хабра. Данная функция создает миниатюру изображения сохраняя ее пропорции!

ВНИМАНИЕ.
Содержимое данной статьи морально устарело но сохранено для академических целей.

Вот эта функция:

// функция создаёт "миниатюру" изображения сохраняя пропорции
// и обрамляет неиспользуемое пространство в стиле Philips Ambilight
// Входные параметры:
//      $image_from         - имя файла исходного изображения
//      $image_to           - имя файла результирующего изображения
//      $width              - желаемая ширина результирующей "миниатюры"
//      $height             - желаемая высота результирующей "миниатюры"
//      $padding            - минимальная рамка в пикселях (по умолчанию = 5)
//      $dest_image_type    - тип изображения для сохранения (по умолчанию JPG):
//          2 - JPG
//          3 - PNG
// Возвращает:
//      TRUE   - в случае успеха
//      FALSE  - в случае неудачи
function aidsoid_resize_image($image_from, $image_to, $width=200, $height=200, $padding=5, $dest_image_type=2) {
    $image_vars = getimagesize($image_from);
    if (!$image_vars) {
        return FALSE;
    }
    $src_width = $image_vars[ 0];
    $src_height = $image_vars[1];
    $src_type = $image_vars[2];
    if (($src_type != IMAGETYPE_JPEG) and ($src_type != IMAGETYPE_PNG)) {
        return FALSE;
    }
 
    switch ($src_type) {
    case IMAGETYPE_JPEG:
        $src_image = imagecreatefromjpeg($image_from);
        break;
    case IMAGETYPE_PNG:
        $src_image = imagecreatefrompng($image_from);
        break;
    default:
        return FALSE;
        break;
    }
    if (!$src_image) return FALSE;
 
    // создаем задний фон для нового изображения
    $dest_image = imagecreatetruecolor($width, $height);
 
    // копируем из исходного изображения в фон и растягиваем без соблюдения пропорций
    $result = imagecopyresized($dest_image, $src_image,  0,  0,  0,  0, $width, $height, $src_width, $src_height);
    if (!$result) return FALSE;
 
    // применяем к фону размытие
    for ($i= 0; $i<=100; $i++) {
        $result = imagefilter($dest_image, IMG_FILTER_SMOOTH, 6);
        if (!$result) return FALSE;
    }
 
    // деление на ноль - плохая идея
    if ( ($src_width ==  0) or ($src_height ==  0) ) {
        return FALSE;
    }
 
    // вычисляем масштабный коэффициент
    $ratio = min( ($width-2*$padding)/$src_width , ($height-2*$padding)/$src_height );
 
    // вычисляем новые размеры изображения
    $new_width = $ratio * $src_width;
    $new_height = $ratio * $src_height;
 
    // если новая высота или новая длина больше оригинальных,
    // то это значит, что изображение будет растянуто, не нужно допускать этого,
    // в этом случае оставим оригинальное изображение без изменения размеров
    if ( ($new_width >= $src_width) or ($new_height >= $src_height) ) {
        $new_width = $src_width;
        $new_height = $src_height;
    }
 
    // скопируем поверх фона получившееся изображение
    $result = imagecopyresampled($dest_image, $src_image, round(($width-$new_width)/2), round(($height-$new_height)/2),  0,  0, $new_width, $new_height, $src_width, $src_height);
    if (!$result) return FALSE;
 
    // сохраняем на носитель
    switch ($dest_image_type) {
    case IMAGETYPE_JPEG: // качество изображения 100
        $result = imagejpeg($dest_image, $image_to, 100);
        break;
    case IMAGETYPE_PNG: // максимальный уровень сжатия 9
        $result = imagepng($dest_image, $image_to, 9);
        break;
    default:
        return FALSE;
        break;
    }
    if (!$result) return FALSE;
    chmod($image_to, 0777);
 
    return TRUE;
}

А вызываем мы ее вот так:

// данная строка делает изображение и сохраняет его на сервер
aidsoid_resize_image($image_from, $image_to, 200, 200, 5, 2);

Самое интересное что она может не сработать по неадекватной как кажется причине: при вызове функции imagefilter библиотеки GD. Пришлось искать решение… Вот что было найдено на просторах интернета: http://mgccl.com/2007/03/02/imagefilter-function-for-php-user-without-bundled-gd . Это очередная PHP функция которая позволяет использовать imagefilter без обращения к GD, ее надо вставить до вызова нашей функции aidsoid_resize_image. Но есть у нее и минусы —  она заметно снижает производительность скрипта.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Copyright © Programmer Weekdays | Powered by WordPress