Dzisiaj drugi odcinek Waszego ulubionego serialu: Wygrzebane z GitHuba. Wszystkie stacje TV rywalizują o wyłączność na emisję kolejnego odcinka, padają kwoty siedmiocyfrowe wyrażane w zimbabwiańskich dolarach…
Imagine to udana próba ujednolicenia interfejsów różnych bibliotek graficznych w zakresie manipulacji obrazami w PHP. Nieważne czy pod maską mamy GD, ImageMagick czy Gmagick. Wszystkie operacje wykonamy za pomocą jednolitego interfejsu. Dokumentacja do znalezienia tutaj.
Pomimo tego iż projekt ma dopiero nieco ponad rok, jest przez ten czas wykonany kawał dobrej roboty. Projekt ma ładną strukturę wyrażoną w namespacach, przez co można śmiało ładować tylko potrzebne klasy za pomocą standardowego SplClassLoadera (do pociągnięcia np. stąd).
O Imagine pisał php|architect, jest również prezentacja.
Poniżej zademonstruję jak można użyć tego cuda do zmniejszenia zestawu obrazków do jednolitych kwadratów i wyświetlić na ekran w locie. To oczywiście metoda dla masochistów CPU, bo normalnie człowiek przecież zapisuje obrazki najpierw na dysk, a dopiero potem wyświetla. Efekt, który chcemy uzyskać będzie wyglądał tak:

<?php
require_once 'SplClassLoader.php';
// rejestrujemy przestrzen nazw Imagine
// i wskazujemy gdzie jej szukac
$classLoader = new SplClassLoader('Imagine', 'lib');
$classLoader->register();
// importujemy niezbedne klasy
use Imagine\ImageInterface;
use Imagine\Gd\Imagine;
use Imagine\Image\Box;
use Imagine\Image\Color;
use Imagine\Image\Point;
$columns = 2;
$images = 4;
$singleImgSize = 250;
// licze calkowita szerokosc tla
$backgroundXSize = (int) $columns * $singleImgSize;
// wysokosc zaokraglam w gore dla nieparzystych
$backgroundYSize = (int) $singleImgSize * ceil($images / $columns);
// jezeli mam i chce skorzystac z ImageMakicka
// to po prostu importuje wyzej
// use Imagine\Imagick\Imagine;
$imagine = new Imagine();
// tworze pusty obrazek w czarnym kolorze i 0 przezroczystosci
$background = $imagine->create(new Box($backgroundXSize, $backgroundYSize), new Color('000', 0));
// tablica z nazwami obrazkow do przeskalowania
// i wyswietlenia
$imagesArray = array('img1.jpg', 'img2.jpg', 'img3.jpg', 'img4.jpg');
// punkty startowe wklejania
$x = 0;
$y = 0;
foreach ($imagesArray as $img) {
// otwieram obrazek z dysku,
// zmniejszam go do kwadratu
// uzywam trybu OUTBOUND,
// czyli pilnuję proporcji i wywalam fragmenty dluzszego boku
$image = $imagine->open('../images/' . $img)
->thumbnail(new Box($singleImgSize, $singleImgSize), ImageInterface::THUMBNAIL_OUTBOUND);
// wklejam zmniejszony obrazek do tla
// podajac lokalizacje lewego gornego rogu wklejania
$background->paste($image, new Point($x, $y));
// licze pozycje startowa dla nastepnego obrazka
$x += $singleImgSize;
if ($x >= $canvasXSize) {
$x = 0;
$y += $singleImgSize;
}
}
// obiekt Image obsluguje metode
// __toString() w postaci danych binarnych PNG
// wystarczy tylko podac naglowki
header('Content-Type: image/png');
// zamiast wyswietlac mozemy uzyc
// $background->save('obrazek.png',array('quality' => 85));
echo $background;
Oprócz typowych manipulacji typu skalowanie czy konwersja na inne formaty, projekt ma aspiracje na dosyć zaawansowane manipulacje obrazami typu odwracanie w poziomie i pionie, refleksy, wykresy, ujednolicony interfejs rysowania obiektów, histogramy itd.
Obrazki na licencji CC-BY pożyczone z Flickra. Właściciele praw do obrazków: pierwszego, drugiego, trzeciego, czwartego.