Складне масштабування зображень в php
Складне масштабування зображень в PHP
Суть проблеми
перші ідеї
З самого початку роботи над проектом я знав, що існує така річ, як ImageMagick для Perl. Запустити цей чудо-модуль мені так і не вдалося. Потім я перейшов на PHP, і зрозумів, що Perl не зовсім пристосований для таких речей. На PHP теж можна формувати картинки за допомогою модуля GD. Він хоч і простіше буде, але функції масштабування в ньому є, що і було потрібно.
Постановка завдання - написати скрипт, який одержує шлях вихідного зображення і виводив би дані image / jpeg - картинку потрібного формату (див. Опис протоколу HTTP).
Скрипт масштабування resize.php
Подивимося початок скрипта:
Тут як зазвичай перевіряються вхідні параметри. Ви, звичайно, можете задати більш жорсткі умови перевірки. Дивимося далі.
У цій частині програми ми завантажуємо вихідне зображення в змінну $ src. Функції imagesx і imagesy визначають розміри вихідної картинки і записують їх у відповідні змінні. Вони нам знадобляться для обчислення коефіцієнта пропорційності. Тут же за допомогою функції header передаємо заголовок 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 верхнього лівого кута квадратного блоку (без різниці для горизонтальної або вертикальної картинки). Це видно на малюнках.
Зазвичай в горизонтальних картинках (особи, пейзажі, об'єкти) найбільш інформативна центральна частина, а в вертикальних (найчастіше це стоять люди) - найбільш важлива верхня частина. Щоб змінити вирізати фрагмент вертикальної картинці, рядок:
можна замінити на
Тоді в вертикальної зображенні буде брати не верхня частина, а середня (це залежить від розташування об'єктів на фотографії). Точно так само можна брати нижню частину або праву / ліву частину горизонтальної картинки - поекспериментуйте з координатами. Особливо цей метод стане в нагоді, якщо потрібно створити квадратні «прев'юшки» (thumbnails) в одній таблиці.
В кінці виводимо картинку imagejpeg () і очищаємо пам'ять imagedestroy ().
демонстрація масштабування
Щоб вам не доводилося гарячково міняти вхідні змінні в процесі налагодження на локальному сервері, пропоную демо-сторінку, яка завантажує чотири картинки різних форматів. Тестові вихідні картинки повинні зберігатися в поточній директорії під іменами image1.jpg і image2.jpg. Тут же повинен знаходитися файл resize.php. який на виведенні видає jpeg-зображення.
Цей скрипт досить простий, він всього лише формує сторінку, посилання, здійснює всю навігацію по каталогу картинок. Вся робота по завантаженню картинок проводиться через resize.php. Його можна взяти за основу простого веб-альбому.
Чому не працює GD?
Я налагоджувати скрипти в Windows, тому поясню рішення проблеми саме для цієї ОС. Швидше за все, причина непрацездатності скрипта в відсутності модуля php_gd.dll (або новіший php_gd2.dll). Відкрийте директорію з інтерпретатором PHP, створіть директорію extensions, якщо її немає. Знайдіть вищевказаний модуль - він є в повних дистрибутивах PHP. Пропишіть в php. ini (лежить в c: \ windows) рядок extension = php_gd2.dll (а заодно і extension_dir = "c: \ php \ extensions". якщо такої немає). Шляхи можуть бути іншими. Після цього все повинно запрацювати. Чи не «змішуйте» модулі php_gd.dll і php_gd2.dll - інтерпретатор буде лаятися на дублювання функцій в бібліотеках.