январь 24, 2006

—ложное масштабирование изображений в PHP („асть 1)

—тать€ описывает методику сложного форматировани€ изображений на PHP под нужный формат независимо от их начальных размеров и ориентации, но всегда выдаЄт изображени€ строго определЄнного размера. ¬ скрипте используютс€ функции обработки изображений библиотеки GD. —крипт будет полезен дл€ новостных сайтов и фотогалерей.

—уть проблемы

–абота€ над новостным сайтом, € столкнулс€ с проблемой хранени€ картинок к стать€м в двух форматах Ц мелкий (90 на 90 дл€ заголовочных блоков) и крупный (218 на сколько есть). Ќовости хранились в базе и добавл€лись очень просто. — картинками выходило сложнее. »сходные изображени€ с цифровой фотокамеры (или цифрового макета бумажной газеты) загружались в PhotoShop и обрабатывались дизайнером под нужный формат. ”же сам факт ручной работы с графикой заставил задуматьс€ об автоматизации.  роме того, приходилось локально сохран€ть две картинки, а потом закачивать их через форму по отдельности, да чтоб ещЄ и не перепутать, где кака€! ¬озникает избыточность, а размер занимаемого места становилс€ всЄ больше и больше.

ѕервые идеи

— самого начала работы над проектом € знал, что существует така€ вещь, как ImageMagick дл€ Perl. «апустить этот чудо-модуль мне так и не удалось. ѕотом € перешЄл на PHP, и пон€л, что Perl не совсем приспособлен дл€ таких вещей. Ќа PHP тоже можно формировать картинки с помощью модул€ GD. ќн хоть и попроще будет, но функции масштабировани€ в нЄм есть, что и требовалось.

ѕостановка задачи Ц написать скрипт, получающий путь исходного изображени€ и выводил бы данные image/jpeg Ц картинку нужного формата.

—крипт масштабировани€ resize.php

¬ходные параметры:
Х $f Ц им€ файла в виде path/file.jpg. ћожно было придумать более защищЄнный способ адресации, но суть алгоритма не мен€етс€. Ќапример, предавать только номер статьи из базы, а скрипт сам бы определил местонахождение картинки;
Х $q Ц качество сжати€ JPEG;
Х $type Ц формат картинки (в смысле линейные размеры) где в зависимости от значени€ $type производ€тс€ следующие действи€:
o $type = 0 Ц из исходной картинки вырезаетс€ квадратна€ серединка и приводитс€ к формату 90x90 пикселей;
o $type = 1 Ц исходна€ картинка масштабируетс€ пропорционально и приводитс€ к ширине 218 пикселей (опционально наноситс€ надпись);
o $type = 2 Ц исходна€ картинка выводитс€ без изменений.

ѕосмотрим начало скрипта:

resize.php

<?php

// f - им€ файла
// type - способ масштабировани€
// q - качество сжати€
// src - исходное изображение
// dest - результирующее изображение
// w - ширниа изображени€
// ratio - коэффициент пропорциональности
// str - текстова€ строка

// тип преобразовани€, если не указаны размеры
if ($type == 0) $w = 70; // квадратна€ 70x70
if ($type == 1) $w = 90; // квадратна€ 90x90
if ($type == 2) $w = 218; // пропорциональна€ шириной 218


// качество jpeg по умолчанию
if (!isset($q)) $q = 100;

«десь как обычно провер€ютс€ входные параметры. ¬ы, конечно, можете задать более жЄсткие услови€ проверки. —мотрим дальше.

// создаЄм исходное изображение на основе
// исходного файла и опередел€ем его размеры
$src = imagecreatefromjpeg($f);
$w_src = imagesx($src);
$h_src = imagesy($src);

header("Content-type: image/jpeg");

¬ этой части программы мы загружаем исходное изображение в переменную $src. ‘ункции imagesx и imagesy определ€ют размеры исходной картинки и записывают их в соответствующие переменные. ќни нам понадоб€тс€ дл€ вычислени€ коэффициента пропорциональности. «десь же с помощью функции header передаЄм заголовок Content-type: image/jpeg в браузер пользовател€. ѕосле этого он ожидает, что следующий поток данных будет jpeg-файлом.

продолжение следует...

„асть 2

–азместил:

јвтор: fox++

 омментарии

1. 02.02.06 14:47 ќт: јлександр

Ќе работает. Ѕиблиотеку php_gd2.dll подключил, функции действуют, но на экран вывод€тс€ системные символы вместо измененного рисунка (не работает header?)

2. 02.02.06 17:11 ќт: јноним.

јлександр: header('Content-type: image/jpeg'); добавте в самое начало.

3. 16.02.06 10:44 ќт: јлександр

все равно не работает, может быть что-то в настройках php.ini (у мен€ п€та€ верси€ PHP со всеми библиотеками dll).  ажетс€, проблема заключаетс€ в том, что браузеру неверно сообщаетс€ тип заголовка и поэтому используетс€ заголовок по умолчанию - text.

4. 17.04.06 15:48 ќт:

"ѕотом € перешЄл на PHP, и пон€л, что Perl не совсем приспособлен дл€ таких вещей."
гениально!!!

5. 23.02.08 19:19 ќт: –°–µ—А–≥–µ–є

"–Я–Њ—В–Њ–Љ —П –њ–µ—А–µ—И—С–ї –љ–∞ PHP, –Є –њ–Њ–љ—П–ї, —З—В–Њ Perl –љ–µ —Б–Њ–≤—Б–µ–Љ –њ—А–Є—Б–њ–Њ—Б–Њ–±–ї–µ–љ –і–ї—П —В–∞–Ї–Є—Е –≤–µ—Й–µ–є."


–Я–Х–†–Ы –Я–†–Х–Ъ–†–Р–°–Э–Ю –Я–†–Ш–°–Я–Ю–°–Ю–С–Ы–Х–Э –Ф–Ы–ѓ –Т–°–Х–У–Ю, –≤ –Ґ.–І. –Є –Ф–Ы–ѓ –Ґ–Р–Ъ–Ш–• –Т–Х–©–Х–Щ. –Ѓ–Ј–∞—О —Б–≤—П–Ј–Ї—Г Perl+ImageMagick –Є –њ–Њ–і Unix'–∞–Љ–Є –Є –њ–Њ–і –Т–Є–љ–і–Њ–є –±–µ–Ј –≤—Б—П–Ї–Є—Е –њ—А–Њ–±–ї–µ–Љ!

6. 04.03.08 05:28 ќт: wembaster

у ¬ас есть возможность заработать деньги на исход€щем с ¬ашего сайта трафике, разместив рекламу подобную google ADSENS на своЄм сайте.
присоедин€йтес, не пожалеете http://tak.ru/partner.php?id=148860

7. 27.05.08 08:27 ќт: designs

дизайн

8. 20.05.09 03:24 ќт: ¬ероника

привет

¬аш комментарий

ќбсудить на форуме?

ѕодумайте, прежде чем высказать своЄ мнение. ѕостарайтесь сделать свой комментарий полезным дл€ других. Ќе используйте ненормативную лексику. ѕользователи, пишущие "от нечего делать" бессмысленные наборы символов, будут блокироватьс€ навсегда.