Сложно мащабиране на изображения в PHP
Статията описва техника за сложно форматиране на изображения в PHP до желания формат, независимо от първоначалния им размер и ориентация, но винаги създава изображения със строго определен размер. Скриптът използва функциите за обработка на изображения на GD библиотеката. Скриптът ще бъде полезен за новинарски сайтове и фото галерии.
Същността на проблема
Първи идеи
От самото начало на работата по проекта знаех, че има такова нещо като ImageMagick за Perl. Не успях да стартирам този модул-чудо. След това преминах към PHP и разбрах, че Perl не е много подходящ за такива неща. В PHP можете също да генерирате картини с помощта на GD модула. Въпреки че ще бъде по-опростен, той има функции за мащабиране, което беше задължително.
Изявлението на задачата е да се напише скрипт, който получава пътя на изходното изображение и извежда изображение/jpeg данни - картина в желания формат (вижте описанието на HTTP протокола).
Resize.php скрипт за мащабиране
Нека да разгледаме началото на скрипта:
Тук, както обикновено, се проверяват входните параметри. Разбира се, можете да зададете по-строги условия за проверка. Да погледнем по-нататък.
В тази част на програмата зареждаме оригиналното изображение в променливата $ src. Функциите imagesx и imagesy определят размерите на оригиналното изображение и ги записват в съответните променливи. Ще ни трябват за изчисляване на коефициента на пропорционалност. Тук, използвайки функцията за заглавка, предаваме заглавката Content - type: image / jpeg към браузъра на потребителя. След това очаква следващият поток от данни да бъде jpeg файл.
Следното условие отговаря за размера на показаното изображение и директно за изхода. Възможно е оригиналното изображениевече правилния размер. Ако не е, ще го обработим. За да направим това, задаваме следното условие:
Следващата част от програмата ще напасне изображението до ширина от 218 пиксела (пропорционално намаление) за случай $ type=1.
Следващата част от кода е напълно незадължителна. Тя отпечатва произволен надпис върху готовата картина. Освен това в контрастен цвят: на тъмен фон надписът ще бъде бял, на светъл фон - черен. Първо дефинираме координатите на изходния текст (в нашия пример това е долу вдясно) и три цвята - $white, $black и $gray с помощта на функцията imagecolorallocate. За да определим какъв цвят да отпечатаме надписа, нека сравним цвета на точката (функция imagecolorat), където ще бъде надписът, със "средния" цвят $gray. Ако цветът на точката е по-светъл от сивото, тогава етикетът ще бъде черен ( $color = $black ). Ако цветът на точката е по-тъмен от сивото, етикетът ще бъде бял ( $color = $white ). Накрая дефинираме низа $str и го прилагаме с функцията imagestring, като указваме размера на шрифта, координатите, низа и цвета. Имайте предвид, че тази функция извежда само латински символи в един шрифт. Въпреки че никой не ви забранява да използвате TrueType шрифтове, има такива функции.
Частта от кода за получаване на квадратен фрагмент изглежда малко по-сложна.
Ние не определяме коефициент на мащабиране, тъй като картината ще бъде квадратна в известен размер. Размерът на картината може да бъде три вида - хоризонтален, вертикален и квадратен. В първите два случая ще трябва да изрежем и мащабираме квадратна област от правоъгълно изображение. В третия - просто мащаб.
Нека обясня малко конструкцията: round((max($w_src, $h_src) – min($w_src, $h_src)) / 2) . Този израз изчислява координатата x или y на горния ляв ъгъл на квадратната кутия (няма разлика захоризонтално или вертикално изображение). Това се вижда на чертежите.
Обикновено при хоризонталните снимки (лица, пейзажи, обекти) централната част е най-информативна, а при вертикалните (най-често това са стоящи хора) най-важна е горната част. За да промените изрязания фрагмент на вертикално изображение, редът:
може да се замени с
Тогава във вертикалната снимка ще бъде заснета не горната, а средната част (това зависи от местоположението на обектите на снимката). По същия начин можете да вземете долната или дясната / лявата страна на хоризонтална картина - експериментирайте с координатите. Този метод е особено полезен, ако трябва да създадете квадратни "миниатюри" в една таблица.
Накрая показваме изображението imagejpeg() и изчистваме паметта на imagedestroy().
Увеличете демонстрация
За да не се налага трескаво да променяте входните променливи, докато отстранявате грешки на локален сървър, предлагам демонстрационна страница, която зарежда четири картини в различни формати. Тестовите изходни изображения трябва да се съхраняват в текущата директория под имената image1. jpg и изображение 2. jpg. Файлът за преоразмеряване също трябва да се намира тук. php, който извежда jpeg изображение.
Преглед на изображения
Този скрипт е доста прост, той просто генерира страница, връзки, навигира в каталога с изображения. Цялата работа по зареждането на изображения се извършва чрез resize.php. Може да се вземе като основа на обикновен уеб албум.
Защо GD не работи?
Отстранявам грешки в скриптове на Windows, така че ще обясня решението на проблема за тази конкретна операционна система. Най-вероятно причината за неуспеха на скрипта е липсата на модула php_gd.dll (или по-новия php_gd2.dll). Отворете директория с PHP интерпретатор, създайте директорияразширения, ако не съществува. Намерете горния модул - той е наличен в пълни PHP дистрибуции. Пишете на php. ini (разположен в c: windows) line extension = php_gd2.dll (и в същото време extension_dir = "c: phpextensions", ако не съществува). Пътищата може да са различни. След това всичко трябва да работи. Не "смесвайте" модули php_gd.dll и php_gd2.dll - интерпретаторът ще се закълне в дублиращи функции в библиотеките.