Search…

Một Số Hàm Xử Lý Đồ Hoạ trong PHP

08/09/20206 min read
Hướng dẫn một số hàm để thao tác, xử lý đồ hoạ trong ngôn ngữ lập trình PHP với thư viện GD.

Ngày nay, nhu cầu về sử dụng đồ hoạ đang bùng nổ rất mạnh mẽ kéo theo sự phát triển không có điểm dừng của các thư viện đồ hoạ trong những năm gần đây. Tiêu biểu có thể kể đến OpenGL, DirectX, ... và nhiều thư viện đồ hoạ mạnh mẽ khác.

Sơ lược về thư viện đồ hoạ GD

GD được ra đời bởi Thomas Boutell và các thành viên khác trong nhóm ông lần đầu tiên vào năm 1994. GD là một mã nguồn mở, được xây dựng từ ANSI C và có giao diện cho nhiều loại ngôn ngữ lập trình khác nhau, có thể kể đến như Perl, Python, PHP,... Phiên bản mới nhất hiện đang được sử dụng và mang tính ổn định cao là 2.1.1, được giới thiệu vào ngày 14/01/2015. Các lập trình viên thường sử dụng thư viện này để hỗ trợ cho việc vẽ biểu đồ, đồ hoạ, hình ảnh, PHP cũng được hỗ trợ bởi thư viện GD.

Một số hàm thông dụng

Thư viện GD cung cấp một số lượng lớn hàm nhằm hỗ trợ nhiều chức năng khác nhau cho người sử dụng. 

imagecreate

Hàm này hỗ trợ tạo nên một hình ảnh, tạo ra một khung hình có kích thước tuỳ chọn mà từ đó người dùng có thể thực hiện các thao tác khác tại đây. 

Cú pháp

resource imagecreate(int $width, int $height)

Trong đó:

  • $width: chiều rộng hình cần tạo.
  • $height: chiều cao hình cần tạo.

Có thể tìm hiểu thêm về hàm imagecreatetruecolor() để tạo một khung ảnh tương tự như trên.

imagecreatefrompng

Tạo một khung ảnh để làm việc với một tấm hình PNG cho trước.

Cú pháp

resource imagecreatefrompng($filepath)

Trong đó:

  • $filepath: đường dẫn đến file hình ảnh cần khởi tạo.

Có thể thực hiện tương tự với một tấm hình JPEG với hàm imagecreatefromjpeg().

imagepng và imagejpeg

Trong quá trình thực hiện các thao tác lên khung ảnh, chắc chắn rằng lúc nào đó sẽ cần lưu lại các thao tác đó, hoặc hiển thị chúng ra ngoài. Thì khi đó imagepng()imagejpeg() sẽ là 2 lựa chọn phù hợp.

Cú pháp

bool imagepng(resource $image[, string $filepath[, int $quality[, int $filters]]])

Trong đó:

  • $image: đối tượng đã thao tác lên đó.
  • $filepath: đường dẫn lưu trữ file, ếu không có hoặc đường dẫn không tồn tại, đối tượng sẽ được xuất ra.
  • $quality: mức độ nén, có giá trị từ 0 đến 9.
  • $filters: bộ lọc cho phép giảm kích thước của hình ảnh.

imagedestroy

Bên cạnh việc khởi tạo một hình ảnh thì GD cũng cung cấp cho người sử dụng cách để huỷ đối tượng đó ra khỏi vùng nhớ.

Cú pháp

bool imagedestroy(resource $image)

Trong đó:

  • $image: biến chứa đối tượng cần huỷ.

imagecolorallocate

Khởi tạo một màu sắc kiểu RGB được truyền vào từ tham số của hàm.

Cú pháp:

int imagecolorallocate(resource $image, int $red, int $green, int $blue)

Trong đó:

  • $image: biến chứa đối tượng mà bạn đang thao tác lên đó.
  • $red$green$blue: chứa giá trị của 3 kênh màu RGB tương ứng.

Hàm imagecolorallocatealpha() có thể khởi tạo một màu sắc khác với cách trên.

imagefilledrectangle

Hàm vẽ hình chữ nhật đầy (hình chữ nhật không rỗng bên trong).

Ngoài ra có thể vẽ hình chữ nhật rỗng bên trong với hàm imagerectangle().

Cú pháp

bool imagefilledrectangle(resource $image, int $x1, int $y1, int $x2, int $y2, int $color)

Trong đó:

  • $image: đối tượng đang thao tác.
  • $x1, $y1: toạ độ điểm đầu.
  • $x1, $y1: toạ độ điểm cuối.
  • $color: màu sắc của hình chữ nhật.

Lưu ý: điểm đầu và điểm cuối là 2 điểm đối nhau qua đường chéo của hình chữ nhật

imagestring

Vẽ một chuỗi ký tự.

Cú pháp

bool imagestring(resource $image, int $font, int $x, int $y, string $string, int $color)

Trong đó:

  • $image: đối tượng đang thao tác đến.
  • $font: font chữ mong muốn, có thể chọn từ 1 đến 5 để sử dụng các font đã hỗ trợ sẵn, hoặc load một font mới với hàm imageloadfont().
  • $x, $y: toạ độ vị trí cần vẽ (toạ độ này được tính ở góc trên bên trái khi chuỗi được vẽ ra).
  • $string: chuỗi cần vẽ.
  • $color: màu sắc của chuỗi khi vẽ.

Một hàm khác cũng để vẽ chuỗi là imagettftext().

imageftbbox

Cú pháp

array imageftbbox(float $size, float $angle, string $fontfile, string $text)

Trong đó:

  • $size: font size của chuỗi truyền vào.
  • $angle: tỷ lệ quay của chuỗi. 0 ứng với bình thường, 45 ứng với chữ sẽ nghiêng 45 độ, 360 ứng với bình thường, ...
  • $fontfile: font chữ của chuỗi.
  • $text: chuỗi truyền vào.

Nhận vào một chuỗi và các thông số liên quan rồi trả về một mảng gồm 8 phần tử chứa toạ độ các điểm như sau:

  • Phần tử 0 và 1: toạ độ của x và y tại vị trí góc dưới bên trái của chuỗi.
  • Phần tử 2 và 3: toạ độ của x và y tại vị trí góc dưới bên phải của chuỗi.
  • Phần tử 4 và 5: toạ độ của x và y tại vị trí góc trên bên phải của chuỗi.
  • Phần tử 6 và 7: toạ độ của x và y tại vị trí góc trên bên trái của chuỗi.

Bằng cách có được tọa độ các điểm này bạn có thể dễ dàng tính được độ dài, rộng của một chuỗi như sau:

function GetWidthString($str, $font_size, $font)
{
	$dims = imagettfbbox($font_size, 0, $font, $str);
	return ($dims[4] - $dims[6]);
}

function GetHeighString($str, $font_size, $font)
{
	$dims = imagettfbbox($font_size, 0, $font, $str);
	return ($dims[3] - $dims[5]);
}

Lưu ý: Vì các chuỗi cần dùng không có tỷ lệ quay nên mặc định là 0.

imagecopymerge

Hỗ trợ lấy một phần (hoặc toàn bộ) tấm ảnh này vẽ lên một tấm ảnh khác tại vị trí mong muốn.

Cú pháp

bool imagecopymerge(resource $dst_im, resource $src_im, int $dst_x, int $dst_y,
                    int $src_x, int $src_y, int $src_w, int $src_h, int $pct)

Trong đó:

  • $dst_im: ảnh được vẽ lên.
  • $src_im: ảnh cần lấy để vẽ.
  • $dst_x, $dst_y: vị trí muốn vẽ trên tấm ảnh được vẽ.
  • $src_x, $src_y: vị trí để bắt đầu lấy tấm ảnh.
  • $src_w, $src_h: chiều rộng và chiều dài cần lấy từ tấm ảnh cần lấy.
  • $pct: độ trong suốt của phần ảnh sau khi được vẽ lên, có giá trị từ 1 đến 100.

Một số ví dụ

Ví dụ 1

Vẽ 1 khung ảnh màu đen, kích thước 200x200

<?php
header("Content-Type: image/png");
$im = imagecreate(200, 200);
$background_color = imagecolorallocate($im, 0, 0, 0);
imagepng($im);
imagedestroy($im);
?>

Kết quả:

Ví dụ 2

Tạo một khung ảnh với một tấm ảnh cho trước và vẽ một tấm ảnh khác lên tấm ảnh đó. Có 2 tấm ảnh như sau:

Vẽ tấm ảnh thứ 2 vào ô trắng của tấm ảnh thứ 1 (toạ độ tại điểm cần vẽ là 66, 38). 

<?php
$dest = imagecreatefrompng ('dest_image.png');
$src = imagecreatefrompng('src_image.png');
imagecopymerge($dest, $src, 66, 38, 0, 0, 256, 256, 100);
imagepng($dest);
imagedestroy($src);
imagedestroy($dest);
?>

Kết quả:

Ví dụ 3

Vẽ một chuỗi ký tự  Hello STDIO! với màu trắng và có nền màu cam.

<?php
header("Content-Type: image/png");
$im = imagecreate(200, 200);
$background_color = imagecolorallocate($im, 183, 183, 183);

$color_text = imagecolorallocate($im, 255, 255, 255);
$background_text = imagecolorallocate($im, 236, 135, 14);

// draw background
imagefilledrectangle($im, 40, 45, 160, 70, $background_text);
//draw text
imagestring($im, 5, 50, 50, 'Hello STDIO!', $color_text);

imagepng($im);
imagedestroy($im);
?>

Kết quả:

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024