Saturday, March 16, 2013

Tutorial PHP : Menggunakan Library Image Processing

Halo, hari ini gw akan menulis sedikit mengenai tutorial php untuk image processing. Tutorial kali ini biasanya sangat dibutuhkan untuk developer dalam meresize gambar. Biasanya developer tidak mungkin memasukkan gambar dalam ukuran dimana user memasukan gambar. Jika hal itu dilakukan oleh seorang developer web maka sudah pasti developer tersebut masih dalam tahap belajar karena tidak mungkin meresize gambar melalui css yang dapat menyebabkan gambar menjadi terpotong. Oleh karena itu perlu dibuat sebuah fungsi khusus untuk meresize gambar sesuai dengan requirement yang diberikan. sebagai gambaran saja dalam proses upload image biasanya developer yang baik memenuhi syarat-syarat berikut.

1. Mengecek extension file. User bisa saja mengupload file yang bukan image, oleh karena itu perlu dibuat pencegahan di sisi server dan juga client (untuk menghemat bandwith).
2. Mengecek ukuran file. Apabila ukuran file yang dimasukkan terlalu besar, maka akan membahayakan bandwith web. Oleh karena itu perlu dilakukan pencegahan dari sisi server dan juga client (untuk menghemat bandwith).
3.  Mengecek orientasi gambar. Ini yang paling penting, karena dengan mengetahui apakah gambar itu portrait atau landscape maka secara otomatis kita bisa mengatur resize imagenya akan berdasarkan height atau width.

Oke, langsung aja berikut library image processing.

<?php 

/*
* File: image_proccessing.php
* Author: Simon Jarvis (2006)
* Link: http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php
* Modified: Hendro Wibowo (2012)
* Link: http://www.tiwule.net/
* Modified: Immanuel Bayu Suryanto (2013)
* Link: http://bayu-immanuel.blogspot.com/
* Semua file dapat disebarluaskan dan dimodifikasi
* Library ini sangat berguna bagi developer namun tidak ada jaminan garansi dari pihak pertama.
*/

class SimpleImage {
   var $image;
   var $image_type;
   var $overwrite = TRUE;
   var $border = TRUE;
   var $ratio;
   var $min_width = 500;

   function load($filename) {
      $image_info = getimagesize($filename);
      $this->image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {
         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {
         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {
         $this->image = imagecreatefrompng($filename);
      }
   }
 
   function save($filename, $image_type, $compression=100, $permissions=null) {
      if($this->overwrite == TRUE) $this->overwriteFile($filename);
      if($this->border == TRUE) $this->drawBorder('210,210,210');
      if($image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } else if( $image_type == IMAGETYPE_GIF ) {
         imagegif($this->image,$filename);
      } else if( $image_type == IMAGETYPE_PNG ) {
         imagepng($this->image,$filename);
      }
      if( $permissions != null) {
         chmod($filename,$permissions);
      }
   }
 
   function output($image_type) {
      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {
         imagegif($this->image);
      } elseif( $image_type == IMAGETYPE_PNG ) {
         imagepng($this->image);
      }
   }
 
   function getWidth() {
      return imagesx($this->image);
   }
 
   function getHeight() {
      return imagesy($this->image);
   }
 
   function resizeToHeight($height, $is_minimum_set = FALSE) {
      $this->ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $this->ratio;
    
      $this->resize($width,$height);
   }

   function resizeToWidth($width) {
      $this->ratio = $width / $this->getWidth();
      $height = $this->getheight() * $this->ratio;
    
      $this->resize($width,$height);
   }
 
   function resizeWithMinToHeight($height) {
      $this->ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $this->ratio;
    
      if($this->getWidth() > $this->min_width) $this->resize($width,$height);
   }

   function resizeWithMinToWidth($width) {
      $this->ratio = $width / $this->getWidth();
      $height = $this->getheight() * $this->ratio;
    
      if($this->getWidth() > $this->min_width) $this->resize($width,$height);
   }

   function scale($scale) {
      $width = $this->getWidth() * $scale/100;
      $height = $this->getheight() * $scale/100;
      $this->resize($width,$height);
   }

   function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      /* setel png dan gif jika transparan */
      if($this->image_type == 1 || $this->image_type == 3){
        imagealphablending($new_image, false);
        imagesavealpha($new_image,true);
        $transparent = imagecolorallocatealpha($new_image, 255, 255, 255, 127);
        imagefilledrectangle($new_image, 0, 0, $width, $height, $transparent);
        imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(),  $this->getHeight());
      } else { /* untuk jpeg */
        imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      }
      $this->image = $new_image;
   } 
 
   function crop($x, $y, $target_w, $target_h) {
      $new_image = imagecreatetruecolor($target_w, $target_h);
      imagecopyresampled($new_image, $this->image, 0, 0, $x, $y, $target_w, $target_h, $target_w, $target_h);
      $this->image = $new_image;
   } 
 
   function drawBorder($color, $thickness = 1) {
      $x1 = 0;
      $y1 = 0;
      $x2 = imagesx($this->image) - 1;
      $y2 = imagesy($this->image) - 1;
    
      list($r, $g, $b) = explode(',', $color);
    
      $bordercolor = imagecolorallocate($this->image, $r, $g, $b);
    
      for($i = 0; $i < $thickness; $i++) {
        imagerectangle($this->image, $x1++, $y1++, $x2--, $y2--, $bordercolor);
      }
   }
   
   function overwriteFile($filename) {
      if(file_exists($filename)) {
          return @unlink($filename);
      }
    
      return FALSE;
   }
 
   function getImgRatio() {
       return $this->ratio;
   }
 
   function get_dpi($filename){  
           $a = fopen($filename,'r');
        $string = fread($a,20);
        fclose($a);
      
        $data = bin2hex(substr($string,14,4));
        $x = substr($data,0,4);
        $y = substr($data,0,4);
  
        return array(hexdec($x),hexdec($y));
    }
}

/**
 * End of file image_processing.php
 *
 */
Lalu bagaimana cara menggunakannya? Berikut cara pakainya.
<?php
include "image_processing.php";
  
$simple = new SimpleImage();

$timestamp = strtotime("now");

$filename1 = "17.jpg";
$filename2 = $timestamp."_".$filename1;

$filename3 = "17.jpg";
$filename4 = $timestamp."1_".$filename3;

$filename5 = "TsubasaOzora.png";
$filename6 = $timestamp."_".$filename5;

$filename7 = "banner.gif";
$filename8 = $timestamp."_".$filename7;

$simple->border = FALSE; //tanpa border

/* Resize width tanpa mengurangi kualitas image */
$simple->load($filename1);
$simple->resizeToWidth(400);
$simple->save($filename2, IMAGETYPE_JPEG);

/* Resize width dengan mengurangi kualitas gambar */
$simple->load($filename3);
$simple->resizeToWidth(400);
$simple->save($filename4, IMAGETYPE_JPEG, 50);

/* Resize width untuk gambar png background transparan */
$simple->load($filename5);
$simple->resizeToWidth(400);
$simple->save($filename6, IMAGETYPE_PNG);

/* Resize width untuk gambar gif */
$simple->load($filename7);
$simple->resizeToWidth(200);
$simple->save($filename8, IMAGETYPE_GIF);

echo $simple->getWidth()."<br>"; //dapatkan ukuran image dari gambar yang terakhir
echo $simple->getHeight()."<br>"; //dapatkan ukuran image dari gambar yang terakhir
echo $simple->getImgRatio()."<br>"; //dapatkan ratio image dari gambar yang terakhir

?>
Nah untuk gambarnya bisa cari sendiri ya, masa harus dikasih juga disini hehe. Oke demikian tutorial hari ini. Semoga berguna untuk para developer sekalian hehe.

0 comments: