Miniaturki obrazków PHP – ImageMagick (imagick)

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:

Komentarze: 10 do “Miniaturki obrazków PHP – ImageMagick (imagick)”

  1. 1 eRIZ

    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. 2 Mateusz Żeromski

    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. 3 eRIZ

    A $max ile?

  4. 4 Mateusz Żeromski

    200

  5. 5 eRIZ

    No to tak, czy tak, to coś jest nie tak; i 600, i 300 jest większe od 200. :P

  6. 6 Mateusz Żeromski

    W przypadku 400×150 i 150×400 jest również ok :)

  7. 7 J.

    „Aby się zrechabilitować postanowałem”
    Zainstaluj sobie moduł sprawdzający poprawność pisowni ;-)

  8. 8 bash

    przydatne ;)

  9. 9 tk1

    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. 10 Voyager

    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.

Napisz komentarz



Wersja mobilna