ImaGick สุดยอด Extension ทำงานเกี่ยวกับภาพ

เอาล่ะ ขยันอัพบล๊อกเลย วันนี้ เขียนมันติดๆ กันเอาให้คุ้มๆ ขอ ชะแว๊บ มาในส่วนของ PHP สักเรื่องนะครับ หลายๆ คนคงรู้จัก Imagemagick มาก่อน นั่นก็คือชุด การทำงานที่เกี่ยวกับ Image ที่ครบเครื่องอย่างแรง ตัวนึง ซึ่งมีคนใช้กันทั่วโลก แต่ทว่า….

ที่ผมจะมาแนะนำวันนี้มันไม่ใช่ ImageMagick ครับ แต่มันคือ Imagick ซึ่งเป็น extension แกะกล่องของ PHP (หา Docs ยากฉิบ -*-) ที่แม้แต่ใน php.net ยังหา Docs มันได้ไม่สมบูรณ์ (แม้แต่น้อย เรียกว่า มันโชว์แค่ชื่อ function เลยจะดีกว่า)

โดยที่ข้อดีของมันต่างกับ imagemagik ยังไง

1. เป็น extension ตัวนึงของ PHP ที่ทำงานในลักษณะ OOP (ลักษณะเดียวกับพวก Soap, lop, DOM, etc.) ทำให้ใช้งานง่าย นึกภาพการใช้งาน library ตัวนึง ที่เราไม้ต้องรู้ว่า มันมีการทำงานยังไง รู้แค่ว่าจะเอา method อะไรมาใช้งาน

2. มีคนทำการ Benchmark มาแล้วว่าความเร็วระหว่าง ImageMagick กับ Imagick นั้นมันคนละเรื่อง เนื่องจาก มันไม่ต้องทำงานผ่านคำสั่ง exec อีกต่อไป

แต่ข้อเสียมันก็หนักหนาไม่ใช่เล่น
1. เนื่องจากมันยังใหม่อยู่มากๆ Search หาใน Google ข้อมูลที่จะเอามาใช้งานได้แทบจะไม่มี ต้องงมกันเอาเอง

2. แค่ข้อแรก มันก็หนักพอแล้ว อย่ามีข้อ 2 เลยดีกว่า

แต่ทั้งนี้ทั้งนั้น อย่าใให้ความยากลำบากมาเป็น อุปสรรคในการใช้งานของดีๆ กันเลย มามั่วๆ กันเอาเองดีกว่า อิอิ

ซึ่งการใช้งานบางตัวมันก็ไม่ได้ยากอะไรมาก เช่นการทำ Resize รูป อิอิ เอาของง่ายที่สุดก่อน

  1. <?php
  2. $im = new Imagick(‘images/original.jpg’);
  3. $im->thumbnailImage(200, null);
  4. $im->borderImage(‘red’, 5, 5);
  5. ?>

เท่านี้แหละ ก็จะได้ภาพ Resize ขนาด 200×200 ที่มี border 5 รอบด้าน เขียนง่ายดีมั้ยครับ

แต่ I นี่มันแค่ของอนุบาลสำหรับความสามารถมันน่ะครับ ลองมาดูตัวอย่างซึ่ง GD ปกติ ทำไม่ได้กันดีกว่า

  1. <?php
  2. $logo = new Imagick("images/logo.gif");
  3. $logo->paintTransparentImage("#025AA4",0,0);
  4. $logo_width = $logo->getImageWidth();
  5. $logo_height = $logo->getImageHeight();
  6.  
  7. $im = new Imagick("tiled/tiled7.gif");
  8. $new_im = new Imagick();
  9. $new_im->setFormat("gif");
  10.  
  11. foreach ($im as $image) {
  12.    $tmp =new Imagick();
  13.    $tmp->newImage( $logo_width, $logo_height, "transparent", "gif" );
  14.    $new_im->addImage( $tmp->textureImage( $image ) );
  15.    $new_im->compositeImage( $logo, Imagick::COMPOSITE_OVER, 0, 0 );
  16. }
  17.  
  18. header( "Content-Type: image/gif" );
  19. echo $new_im->getImagesBlob();
  20. ?>

จากตัวอย่างนี้มันคือการสร้าง Glitter ใส่ตำแหน่งของภาพที่เราต้องการนั่นเอง ลองนึกภาพ ตามผมนะครับ

สมมุติ ภาพนึงมี สีในภาพเยอะแยะไปหมด แต่เราต้องการให้สี นึงมันเปลี่ยนเป็นลาย wink wink (gif animation)

1. ขั้นแรกที่เราต้องทำก็คือการนำ image เข้ามา
2. ต่อจากนั้นเรามา mark ตำแหน่งสีที่จะเปลี่ยนเป็น wink wink โดยทำให้มันเป็น Transparent ซะ
3. หาขนาดความกว้าง ความสูง เพื่อที่เราจะสร้าง ลาย wink wink ที่มีขนาด เต็มตามต้นฉบับ
** Wink Wink ต้องอยู่ในลักษณะของ Pattern
4. ทำการเรียกลาย Glitter
5. set format ให้ว่าจะทำเป็น gif
6. แตก Frame ของ Gif ออกมาด้วย Loop foreach
7. สร้างพื้นที่ที่จะวางลาย ขึ้นมาโดยปูพื้น เท่ากับ กว้าง สูง ของภาพเดิมที่หามาได้
8. textureImage คือการปูเป็นลักษณะของ Pattern ให้เต็ม
9. สุดท้ายเอาภาพเก่าที่ทำ Transparent ไว้แล้วมาวางทับ

เท่านี้ลายมันก็จะออกมาเรียบร้อย เพราะว่าเราสั่ง COMPOSITE_OVER คือให้ภาพเก่ามาทับไอ้ลาย Gif นี่ เท่านี้เราก็จะได้ Glitter แล้ว

เหนื่อยแฮะ เอาเป็นว่าถ้าใครสรใจอยากจะลองเล่นไอ้เจ้า Imagick นี่ก็ศึกษาดูคำสั่งมันได้ที่
http://www.php.net/manual/en/book.imagick.php

แต่ว่าต้องเอามาลองเองให้รู้ว่าอะไร มันเป็นอะไรครับ เพราะส่วนใหญ่มันจะไม่มีตัวอย่าง ลาล่ะครับ

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

1 Comment »

 
  • ขอบคุณล่วงหน้าครับ says:

    ลองทำแล้ว ขึ้น Parse error: syntax error, unexpected T_FOREACH in line (บันทัดที่มี foreach)

 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>