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()
và 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àmimageloadfont()
.$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ả: