
Quá trình xử lý ảnh
thumbnail với PHP

Về bản chất, có rất nhiều website lưu trữ những thư viện ảnh riêng biệt và kiểu thiết
kế dùng chung, tất cả được “nhúng” trong trang đi kèm với những ảnh thumbnail,
mục đích của việc làm này là khi người sử dụng nhấn vào mỗi ảnh thumbnail thì
website sẽ hiển thị ảnh gốc với kích thước lớn hơn. Chúng ta có thể dễ dàng thực hiện
quá trình này bằng cách sử dụng thẻ HTML anchor (<a href=...) được bao quanh bởi
thẻ HTML image (<img src=...). Nhưng làm thế nào để lấy được ảnh thumbnail từ ảnh
gốc có kích thước lớn? Và làm thế nào để đảm bảo được tỉ lệ khung hình của ảnh gốc đó?
Trong bài viết dưới đây, chúng tôi sẽ trình bày một số bước cơ bản để các bạn thực hiện
quá trình này với PHP, và cụ thể là thư viện GD của PHP. Một số thông tin cơ bản khác,
các bạn có thể tham khảo thêm tại đây.
Cơ chế xử lý ảnh của PHP hoạt động như thế nào?
Cụ thể, bên trong mã PHP chúng ta có thể thấy 2 loại ảnh khác nhau. Một loại là chuỗi
các dữ liệu thuộc mã nhị phân “đại diện” cho bức ảnh, và đây cũng chính là những dữ
liệu chúng ta lưu trữ trên file hệ thống của server, được sử dụng bên trong cú pháp của
thẻ HTML <img>. Còn khi muốn hiển thị kích thước khác của ảnh thì chúng ta cần phải
khởi tạo 1 phương thức xuất hiện mới tương ứng. May mắn thay vì trong thư viện GD đã
cho phép người dùng tạo nguồn tài nguyên của PHP hỗ trợ rất tốt tính năng này. Những
chức năng đi kèm của GD cho phép người dùng dễ dàng thực hiện quá trình này tương tự
với cách sử dụng cơ sở dữ liệu truy vấn về các nguồn tài nguyên có liên quan. Khi kết

thúc việc này, hệ thống đã sẵn sàng để lưu và hiển thị ảnh, sau đó là phần còn lại của
PHP có nhiệm vụ trả lại dữ liệu nguồn thành chuỗi mã nhị phân.
Đây là 1 đoạn mã ví dụ trong trường hợp này:
1 <?php // RAY_EE_image_thumbnail.php
2 error_reporting(E_ALL);
3
4
5 // RESIZE AN IMAGE TO FIT INSIDE A DEFINED
TRANSPARENT SPACE
6 // USE CASE: <img
src="RAY_EE_image_thumbnail.php?img=RAY_test_imag
e_thumbnail.jpg&w=150&h=100" />
7
8
9 // ACQUIRE THE ARGUMENTS - MAY NEED SOME
SANITY TESTS?
10 $thumb_w = $_GET["w"];
11 $thumb_h = $_GET["h"];
12 $image_url = $_GET["img"];
13
14 // CREATE THE THUMBNAIL IMAGE RESOURCE

AND FILL IN TRANSPARENT
15 $thumb = imagecreatetruecolor($thumb_w, $thumb_h);
16 imagesavealpha($thumb, TRUE);
17 $empty =
imagecolorallocatealpha($thumb,0x00,0x00,0x00,127);
18 imagefill($thumb, 0, 0, $empty);
19
20 // GET ORIGINAL IMAGE DIMENSIONS
21 $array = getimagesize($image_url);
22 if ($array)
23 {
24 list($image_w, $image_h) = $array;
25 }
26 else
27 {
28 die("NO IMAGE $image_url");
29 }
30
31 // ACQUIRE THE ORIGINAL IMAGE
32 $image_ext = trim(strtoupper(end(explode('.',
$image_url))));
33 switch(strtoupper($image_ext))

34 {
35 case 'JPG' :
36 case 'JPEG' :
37 $image = imagecreatefromjpeg($image_url);
38 break;
39
40 case 'PNG' :
41 $image = imagecreatefrompng($image_url);
42 break;
43
44 default : die("UNKNOWN IMAGE TYPE:
$image_url");
45 }
46
47 // GET THE LESSER OF THE RATIO OF THUMBNAIL
H OR W DIMENSIONS
48 $ratio_w = ($thumb_w / $image_w);
49 $ratio_h = ($thumb_h / $image_h);
50 $ratio = ($ratio_w < $ratio_h) ? $ratio_w : $ratio_h;
51
52 // COMPUTE THUMBNAIL IMAGE DIMENSIONS
53 $thumb_w_resize = $image_w * $ratio;

