Password
    
 К титульной странице  |  Форум  |  О проекте  |  Словарь  |  Товары  |  Сделать стартовой  |  В Закладки   
Авторизация
Забыли пароль?
Регистрация 
 
Программирование
Безопасность
Демосцена
Игры
WEB-мастерская
Программное обеспечение
Аппаратное обеспечение



Последние материалы
  The Chronicles of Riddick: Escape from Butcher bay

  Что такое хорошо и что такое плохо, или FAQ по LCD-мониторам

  Организация удаленного доступа

  Инсталляция программного обеспечения используя GPO

  Smarty в веб-разработке

  BioShock или кафе разбитых надежд...



Последние новости
  Латвия подписала АСТА

  Примечательная промо-акция игры STAR WARS: The Old Republic на Times Square в Нью Йорке

  На сайте выложены первые выпуски легендарной телепередачи о компьютерных играх "От винта!"

  На сайте опубликован энциклопедический словарь по информатике Э.Якубайтиса

  Конференция Разработчиков Видеоигр, 1979

  Более шустрый и динамичный Mail.lv



Charitable advertising
Њл ­г¦¤ Ґ¬бп ў ў иҐ© Ї®¬®йЁ!



Ziedot.lv

Penn State Child Life Program



Программирование --> Perl/PHP
Работаем с графикой в PHP- уменьшаем изображения
  
Автор: Mihail Chernov
Опубликовано: [2005-02-09 00:26]
В данной статье описаны некоторые приёмы работы с 2-х мерной графикой в PHP на примере сценария для уменьшения изображения. Они могут быть полезны как для начинающих PHP программистов, так и для специалистов.

В своё время проиллюстрированые в этой статье функции были разработаны автором, как часть сценария фотогалереи. И, хотя изначально программа была написана на Perl, перевести её на PHP не составляло особого труда. Т.к. для работы с графикой в программе используется библиотека GD (вер. 2) с которой можно работать не только из Perl и PHP, но и из Си. В частности, в дистрибутиве PHP имеется стандартный модуль для поддержки GD.

Вкратце о том, как добавить поддержку этой библиотеки в PHP, говорится в следующей части данной статьи. Следовательно, если на вашем веб-сервере уже установлена библиотека GD и PHP настроен надлежащим образом для работы с ней, можете спокойно пропустить следующую часть статьи.

Установка библиотеки GD

Для ОС Windows

Библиотека включена в дистрибутивы всех последних версий PHP (например у меня 4-ая версия). Для её подключения к PHP достаточно отредактировать файл “%SysDir%\php.ini” следующим образом:

1.   extension_dir = "полный_путь_к_каталогу php\extensions";

2.   extension=php_gd2.dll

   Данная строка по умолчанию является закомментированой, удалите символ “;” в начале её.

После чего необходимо перезапустить web-сервер.

Для Unix`like ОС

Последовательность действий:

1.   Загрузить дистрибутив GD с сайта разработчика http://www.boutell.com/gd

2.   Выполнить комманды:

  • ./configure
  • make
  • make install


  • Описание сценария

    Сценарий представляет из себя 2 функции:

    minimizeImg - основная задача этой функции- уменьшить изображение до заданных размеров. Она уменьшает исходное изображение в n раз (где n - целое, положительное число) и если полученное изображение немного вылезает за заданные гранницы, либо наоборот имеет меньшие, чем указанные функции размеры, то изображение урезается или размещается посередине соответственно (ниже проиллюстрированы примеры). Кроме основной задачи, функция может также преобразовать изображение из одного типа в другой (будет работать только с типами поддерживаемыми установленной у вас версией GD).

    Функция получает на вход:
    ·	$width - требуемую ширину изображения;
    ·	$height - требуемую высоту изображения;
    ·	$fin - (нет, это ещё не конец по французски=) имя и путь 
                                                    к файлу с исходным изображением;
    ·	$fout - имя и путь к файлу, куда будет записано
                                                       уменьшенное изображение.
    Функция возвращает:
    ·	0 - не удалось уменьшить изображение;
    ·	1 - функция отработала успешно (изображение уменьшено). 
    
    

    getImageType - функция определяющая тип изображения по расширению файла. Является вспомогательной для minimizeImg.

    
    Функция получает на вход:
    ·	$filename - имя файла, содержащего изображение;
    Функция возвращает:
    ·	Jpeg
    ·	Gif  (GD открывает этот тип изображений только для чтения. 
                  Это связанно с авторскими правами формата “gif”.
    
    ·	Png
    ·	0 - тип изображения не поддерживается GD (ver. 2)
    
    

    Исходники сценария

    
    
    <?php
    
    
    //############################################# 
    // Функция getImageType определяет формат 
    // изображения по расширению его файла. 
    // В нашем случае,она является вспомогательной
    // для функции minimizeImg (см. ниже);
    
    // Вход: $filename - название файла.
    
    // Выход: Если тип изображения поддерживается
    // библиотекой GD (ver. 2.), то функция возвращает
    // его название, иначе 0. 
    
    
    function getImageType($filename) {
    if (preg_match('!\.(jpg|jpeg)$!si',$filename)) {
    return 'Jpeg';
    } else if (preg_match('!\.gif$!si',$filename))  {
    return 'Gif';
    } else if (preg_match('!\.png$!si',$filename)) {
    return 'Png';
    }
    return 0;
    }
    
    
    // После вызова функция getImageType
    // начинает сравнивать расширение файла
    // переданного ей в качестве параметра 
    // (значение переменной $filename)
    // с расширениями типов поддерживаемых GD.
    // Для этого используются регулярные выражения.
    // Если результатом хотя бы одной проверки 
    // будет истина, функция вернёт название 
    // соответствующего типа. Иначе, результатом
    // выполнения функции окажется 0.
    
    
    
    //############################################# 
    // Функция minimizeImg уменьшает изображение 
    // (имя файла = $fin) в n раз 
    // (где n-натуральное число).
    //  
    // Если уменьшенное изображения будет немного 
    // не помещаться в указанные рамки 
    // (значения переменных $width и $height), 
    // оно будет урезано до этих размеров.Если 
    // уменьшенное изображение окажется меньше, 
    // оно будет размещено посередине 
    // картинки - результата ($fout).
    
    
    function minimizeImg($width,$height,$fin,$fout) {
    
    
    // Пытаемся узнать размеры изображения из файла 
    // $fin. Если результат "ложь", то функция
    // выдаёт 0 и заканчивает свою работу. 
    
    if (!$size=GetImageSize("$fin")) {
     return 0;
    }
    
    
    // С помощью вышеописаной функции
    // getImageType узнаём тип исходного изображения
    // и запоминаем его на будущее в переменной 
    // $typein. Таким же образом распознаём тип 
    // изображения-результата и запоминаем
    // в переменной $typeout.
    
    $typein=getImageType($fin);
    $typeout=getImageType($fout);
    
    
    // Если тип хотя бы одного изображения
    // не установлен (о чём будет свидетельствовать
    // значения равное 0 в $typein или/и $typeout), 
    // либо изображение-результат имеет тип "gif" 
    // происходит выход из функции (возвращаемый 
    // результат - 0.
     
    if (($typeout=='Gif')||($typeout=='0')||($typein=='0')) {
     return 0;
    }
    
    
    // С помощью функции ImageCreateFrom[Type]
    // загружаем файл ($fin)  и присваиваем 
    // указатель на изображение переменной $im_in.
    // Где [Type]- тип открываемого изображения.
    // Чтобы осуществить столь хитрую операцию,
    // нам приходиться использовать функцию eval. 
    
    eval('$im_in=ImageCreateFrom'.$typein.'("$fin");');
    
    
    // Делим ширину исходного изображения на ширину
    // заданую для результирующего изображения. Результат
    // запоминаем в $wm. 
    // Делим высоту исходного изображения на
    // высоту результирующего изображения. 
    // Результат запоминаем в $hm.
    
    $wm=$size[0]/$width;
    $hm=$size[1]/$height;
    
      
    
    // Сравниваем значения переменных $wm и $hm.
    // В результате в $hm оказывается наибольшее 
    // из 2-ух значений.
    
    if ($wm>$hm) {
     $hm=$wm;
    } 
    
    
    // Вычисляем высоту уменьшенного 
    // изображения ($ah) - делим ширину исходного изображения
    // на значение переменной $hm и "откидываем"
    // дробную часть полученного значения
    // (в PHP не существует операции целочисленного
    // деления). 
    // Подобным же образом вычисляем ширину
    // рез. изображения.
    
    $ah=(int) $size[1]/$hm;
    $aw=(int) $size[0]/$hm;
    
    
    // Присваиваем начальные значения координат
    // рез. изображения.
    
    $x1=0;
    $y1=0;
    
    
    // Если ширина уменьшеного изображения
    // получается меньше указанной, то 
    // изображение будет распологатся посередине.
    // рез. изобр. Тоже относится к высоте.
    // В результате уменьшеное изображение
    // будет в центре, а вокруг него будет рамка.
    
     if ($aw<$width) {
      $x1=(int) ($width-$aw)/2;
     }
     if ($ah<$height) { 
      $y1=(int)($height-$ah)/2;
     }
    
    
    // Создаём изображение требуемых размеров
    // и присваиваем его указатель переменной 
    // $im_out.
    
     $im_out=ImageCreate($width,$height);
     
    
    // Определяем цвет рамки (в данном случае RGB(0,0,0)- 
    // - чёрный) и присваиваем его переменной $bgcolor.
    
    $bgcolor=ImageColorAllocate($im_out,0,0,0);
    
    
    // Выводим рамку на рез. изображение.
    
    ImageRectangle($im_out,0,0,$width,$height,$bgcolor);
    
    
    
    // Уменьшаем исх. изобр. и выводим его на рез. изобр.
    // P.S: В результате работы функции ImageCopyResized 
    //      исх. изобр. уменьшается в n раз. Где n-целое, 
    //      положительное число. 
    
    
    ImageCopyResized($im_out,$im_in,$x1,$y1,0,0,(int) 
       $size[0]/$hm,(int) $size[1]/$hm,$size[0],$size[1]);
    
    
    // Сохраняем полученное изображение ($im_out) 
    // в файл ($fout). 
    // Для этого используется функция Image[Type]
    // Где [Type] - тип изображения.
    // В нашем случае,для реализации коректного вызова
    // последней функции необходимо использовать eval.
    
    eval('Image'.$typeout.'($im_out,$fout);');
    
    // Удаляем изображения из памяти.
    // При успешном завершении функция выдаёт 1.
    
    ImageDestroy($im_in);
    ImageDestroy($im_out);
    return 1;
    }
    
    ?>
    

    Тестируем сценарий

    Для того, чтобы убедиться, что сценарий работает как надо, необходимо его испытать в действии. Ниже приведены результаты таких испытаний.

    Исходное изображение (450x338 Jpeg)
    450x338 Jpeg


    Уменьшенное изображение (300x250 Jpeg)
    300x250 Jpeg


    Уменьшенное изображение (250x200 Jpeg)
    250x200 Jpeg


    Уменьшенное изображение (200x200 Png)
    200x200 Png


    Использование и модификация сценария

    Вы можете не только свободно использовать сценарий приведённый в данной статье в ваших проектах, но и как угодно его модифицировать. Например, можно заменить чёрный квадрат (между прочим, копия знаменитой работы Малевича =) на фоновое изображение или выводить уменьшенное изображение вообще без рамки и т.д. и т.п. Словом, всё что вашей душе угодно!

    Заключение

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





    Перейти к рубрике --> PHP

    Наши друзья
    Juridiskie pakalpojumi  
    IT Works
      Codenet - всё для программиста
       
    • Hi-tech NEWS • InCube e-mag
      Программисты, Вам сюда!
    КомментарииВсего:2
    Mihail Chernov
      mihack@inbox.lv
    [2007-04-26 20:44:11]Как я уже писал на форуме :) Материал довольно старый, написан для GD ver. 1. А чтобы всё работало на 2-ой версии надо вместо ImageCreate использовать ImageCreateTrueColor
    KUZ
      kuz007@mail.ru
    [2007-04-06 09:15:00]Все отлично, комментарии обалденные, но почему в уменьшенном изображении искажаются цвета?
    Не могли бы вы ответить, в чем тут проблема?


    Только зарегистрированные пользователи могут оставлять здесь комментарии. Зарегистрироваться можно здесь. Если вы уже зарегистировались ранее, то можете войти в систему здесь.


    © Mihail Chernov (MiHack) Обмен ссылками