Miniaturki obrazków PHP – ImageMagick (imagick)
- Mateusz Żeromski | 2008-06-30 | Php
Ostatnio chciałem wykonać pomniejszanie zdjęć do zadanego rozmiaru, niezależnie od wielkości obrazka, tzn sam obrazek byłby zmniejszany proporcjonalnie jednak byłby wklejany w inny o zadanym rozmiarze w sam środek. Aktualnymi znanymi mi sposobami (gd) już mi się nie chciało robić i szukalem gotowców. Nic odkrywczego nie znalazłem bo tylko ImageMagick, jest to moduł do php5 (php5-imagick), możliwości ma ogromne, jak je zobaczyłem to uznałem że ośmieszyłem się trochę pisząc poprzedni temat o miniaturkach. Aby się zrechabilitować postanowałem napisać nowa klasę Image.class.php która do zmniejszania cachowania obrazków będzie używała klasy ImageMagick.
Założenia
Takie same jak w poprzednim artykule , tzn podaje się parametry w gecie,
image.php?img=images/auto.jpg&max=200. Serwer musi obsługiwać imageMagic (wystarczy spojrzeć na phpinfo() ), aktualnie jest to standard więc nie powinno być problemów.
Kod
Jest on dwukrotnie mniejszy i milion razy lepszy od poprzedniego (bardziej czytelny, zwięzły itp).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | <? class Image { var $config; var $cacheUrl = 'cache_image/'; function __construct($param){ $this -> config = $param; $this -> checkConfig(); $this -> checkCache(); $this -> generate(); } function checkCache(){ $cacheName = $this ->cacheUrl.$this -> config['max'].bin2hex($this -> config['img']); $this -> cacheName = $cacheName; if(is_file($cacheName)){ $im = new Imagick($cacheName); header("Content-type: ".$im->getFormat()); echo $im->getimageblob(); die(); } } function generate(){ $im = new Imagick($this -> config['img']); $max = $this -> config['max']; $im -> thumbnailImage($max,$max, true); $im -> writeImage($this -> cacheName); header("Content-type: ".$im->getFormat()); echo $im->getimageblob(); die(); } function checkConfig(){ $c =$this -> config; if( ( empty($c) )or (isset($c['img']) && !is_file($c['img']) ) or (isset($c['max']) && (!is_numeric($c['max']) || $c['max']<0)) ) $this -> generateError(); } function generateError(){ $errorImage = $this -> cacheUrl.'error'; if(!is_file($errorImage)){ $image = new Imagick(); $draw = new ImagickDraw(); $pixel = new ImagickPixel( 'white' ); $image->newImage(100, 30, $pixel); $pixel->setColor('black'); $text = "error"; $draw->setFontSize( 30 ); $draw -> setFont('Courier'); $image->annotateImage($draw, 4, 24, 0, $text); $image->borderImage(new ImagickPixel('black'), 1, 1); $image->setImageFormat('png'); header ('Content-type: image/png; charset=utf-8'); echo $image; $image -> writeImage($errorImage); die(); }else{ $im = new Imagick($errorImage); header("Content-type: ".$im->getFormat()); echo $im->getimageblob(); die(); } } } $image = new Image($_GET); ?> |
Tagi: php
1 eRIZ 2008-06-30 18:17:43
Mhmm, „ImageMagick„.
Wiesz, sprawdziłbym jeszcze przeliczanie proporcji, bo u Ciebie może nie być $max, to maksymalny wymiar. ;)
Więcej: http://pl2.php.net/manual/pl/function.imagick-thumbnailimage.php#78553
2 Mateusz Żeromski 2008-06-30 21:31:09
Hej – sprawdzalem na obrazku 300/600 oraz 600/300, w obu przypadkach obraz skalował się dobrze, może kom dotyczył jakiejś starszej wersji, pozatym nie wszystkie przykłady z php.net chciały mi działać.
3 eRIZ 2008-07-01 00:49:47
A $max ile?
4 Mateusz Żeromski 2008-07-01 07:03:12
200
5 eRIZ 2008-07-01 12:40:36
No to tak, czy tak, to coś jest nie tak; i 600, i 300 jest większe od 200. :P
6 Mateusz Żeromski 2008-07-04 00:10:08
W przypadku 400×150 i 150×400 jest również ok :)
7 J. 2008-12-22 19:19:19
„Aby się zrechabilitować postanowałem”
Zainstaluj sobie moduł sprawdzający poprawność pisowni ;-)
8 bash 2009-01-09 02:43:16
przydatne ;)
9 tk1 2011-01-27 10:37:15
Najnowsze wersje binarek rozszerzenia PHP Imagick dla Windows można zassać ze stronki http://dev.freshsite.pl/imagick.html. Wersje VC6 i VC9, TS i NTS. PHP 5.2 i 5.3.
pozdrawiam
tk1
10 Voyager 2011-03-29 11:00:15
Witam.
Czy nie powinno się jeszcze zadeklarować atrybutu $cacheName w nagłówku klasy?
class Image {
var $cacheName = null;
…
Bez tego, jak sądzę, miniatura nie będzie się tworzyć w cache’u.
Nie zostanie przekazana z funkcji checkCache() do generate().
Pozdrawiam.