Thứ Tư, 6 tháng 6, 2018

Cắt hình ảnh (crop image) tự động bằng PHP

Nhu cầu cắt hình ảnh tự động trong những website chứa nhiều hình ảnh như web thương mại điện tử, web tin tức, mạng xã hội chia sẻ hình ảnh là cực kỳ cần thiết. Bài viết này hướng dẫn bạn cắt hình sau khi upload bằng ngôn ngữ PHP để tạo ra nhiều hình ảnh kích thước khác nhau và những hình ảnh đó đều có chất lượng tốt chứ không bị vỡ.

Đây là hàm giúp chúng ta thực hiện công việc đó.

function CreateThumbImage($filenameImage, $filenameThumb, $ext, $thumb_width, $thumb_height)
    {
  if($ext == "jpeg" || $ext == "jpg")
  {
   $image = imagecreatefromjpeg($filenameImage);
  }
  if($ext == "png")
  {
   $image = imagecreatefrompng($filenameImage);
  }
  $filename = $filenameThumb;

  // $thumb_width = 300;
  // $thumb_height = 300;

  $width = imagesx($image);
  $height = imagesy($image);

  $original_aspect = $width / $height;
  $thumb_aspect = $thumb_width / $thumb_height;

  if ( $original_aspect >= $thumb_aspect )
  {
     // If image is wider than thumbnail (in aspect ratio sense)
     $new_height = $thumb_height;
     $new_width = $width / ($height / $thumb_height);
  }
  else
  {
     // If the thumbnail is wider than the image
     $new_width = $thumb_width;
     $new_height = $height / ($width / $thumb_width);
  }

  $thumb = imagecreatetruecolor( $thumb_width, $thumb_height );

  switch ($ext) {
      case 'png':
          // integer representation of the color black (rgb: 0,0,0)
          $background = imagecolorallocate($thumb , 0, 0, 0);
          // removing the black from the placeholder
          imagecolortransparent($thumb, $background);

          // turning off alpha blending (to ensure alpha channel information
          // is preserved, rather than removed (blending with the rest of the
          // image in the form of black))
          imagealphablending($thumb, false);

          // turning on alpha channel information saving (to ensure the full range
          // of transparency is preserved)
          imagesavealpha($thumb, true);
          break;

      default:
          break;
  }

  // Resize and crop
  imagecopyresampled($thumb,
                     $image,
                     0 - ($new_width - $thumb_width) / 2, // Center the image horizontally
                     0 - ($new_height - $thumb_height) / 2, // Center the image vertically
                     0, 0,
                     $new_width, $new_height,
                     $width, $height);
  switch ($ext) {
   case 'jpg':
   case 'jpeg':
   {
    imagejpeg($thumb, $filename, 100);break;
   }
   case 'png':
   {
    imagepng($thumb,$filename,1);break;
   }
   default:
   {
    imagejpeg($thumb, $filename, 100);
   }
  }
 }

Hàm này nhận vào 5 tham số $filenameImage, $filenameThumb, $ext, $thumb_width, $thumb_height. Mình giải thích ý nghĩa 5 tham số này như sau:
  • $filenameImage: đường dẫn hình ban đầu
  • $filenameThumb: đường dẫn chứa hình sau khi cắt
  • $ext: đuôi mở rộng của file hình ban đầu
  • $thumb_width: chiều rộng hình sau khi cắt
  • $thumb_height: chiều cao hình sau khi cắt

Trong bài viết này mình sẽ ví dụ trường hợp upload 1 hình ảnh size 300x300 và chương trình sẽ tự tạo ra thêm 2 hình thumb (size 169x169)small (size 50x50).

Đầu tiên mình có 1 form rất cơ bản như sau trong trang web.

<form role="form" action="http://localhost:8080/cropimage/crop.php" method="post"  enctype="multipart/form-data">
  <input type="file" name="file" />
   <button type="submit">Upload</button>
</form>

Sau đó mình chọn 1 file hình size 300x300x từ máy mình và click submit để server gọi đến file crop.php để xử lý. Đây là nội dung file crop.php

<?php



if(isset($_FILES['file']) && $_FILES['file']['size'] > 0)

        {

          $validextensions = array("jpeg", "jpg", "png");

          $temporary = explode(".", $_FILES["file"]["name"]);

          $file_extension = end($temporary);

          if ((($_FILES["file"]["type"] == "image/png")

          || ($_FILES["file"]["type"] == "image/jpg")

          || ($_FILES["file"]["type"] == "image/jpeg"))//approx. 100kb files can be uploaded

          && in_array($file_extension, $validextensions)) {

            define("SITE_PATH", $_SERVER['DOCUMENT_ROOT'].'/cropimage/');  // Thư mục gốc của website

            // Upload hình ban đầu

            move_uploaded_file($_FILES["file"]["tmp_name"], SITE_PATH.$_FILES["file"]["name"]);

            CreateThumbImage(SITE_PATH.$_FILES["file"]["name"], SITE_PATH."thumb/".$_FILES["file"]["name"],$file_extension, 169, 169);

            CreateThumbImage(SITE_PATH.$_FILES["file"]["name"], SITE_PATH."small/".$_FILES["file"]["name"],$file_extension, 50, 50); 

            echo "Upload success!";

          }

          else

          {

            exit("File có duôi không hợp lệ!");     

          }

        }

?>

Đây là kết quả mình đạt được.

Thư mục source

Thư mục small

Thư mục thumb


Đây là link tải source ví dụ:  

Chúc bạn thành công.


EmoticonEmoticon