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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// функция создаёт "миниатюру" изображения сохраняя пропорции
// и обрамляет неиспользуемое пространство в стиле 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;
}

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

1
2
// данная строка делает изображение и сохраняет его на сервер
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. Но есть у нее и минусы —  она заметно снижает производительность скрипта.

Все это занимает много места, поэтому  рекомендую  все функции поместить в отдельный файл и просто делать include…

Теги:

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

  1. mismedical
    Июнь 8th, 2010 at 19:30
    1

    Данной информации, не сомневаюсь, и так достаточно, чтобы сделать вывод, как не надо делать.

    [Ответить]

  2. sitystroyinfo
    Июль 15th, 2010 at 17:12
    2

    «Спасибо за такой пост»

    [Ответить]

  3. девица
    Август 24th, 2010 at 02:21
    3

    Да довольно таки прикольно!

    [Ответить]

Написать комментарий