Thứ Năm, 21 tháng 1, 2016

Đồ họa trong php

     Chúng ta hãy bắt đầu tìm hiểu khái niệm về tệp ảnh là gì và nó đuợc diễn đạt qua máy vi tính như thế nào. Một tệp ảnh chẳng khác nào là một tập hợp của nhiều pixel hay dots bởi một màu sắc nhất định nào đó.
Mọi hình ảnh đều có dạng hình chử nhật (rectangular) và có cạnh dài và ngắn nhất định, đuợc tạo bởi một matrix của pixels. 100 hình mỗi hình có 300 pix sẽ có tổng số pix là 30000 pixels. Trong php, hình ảnh là một hệ thống liên hợp (coordinate). Ví dụ: x bằng 300 và y bằng 100.

Ở góc độ trên bên trái của hình nó sẽ luôn là (0,0). Giá trị của x tăng dần theo khi kéo chéo một đường từ góc trái xuống góc phải đối diện (x,y), cũng như giá trị y tăng dần khi kéo một đường thẳng từ trên xuống dưới(0,y).Khi cho nội dung bất kỳ vào khung ảnh nó luôn liên quan tới góc độ trái phía bên trên. Nhìn ví dụ trên, góc liên hợp (180, 50) đựơc đóng lại phía tay phải của tệp hình, khoảng giữa đổ xuống.
Làm một ví dụ tương tự trong đời sống, để xem hình ảnh đựơc diễn tả như thế nào. Bạn hãy tưởng tượng bạn đặt 100 con cá màu vàng vào một ô có chiều cao là 10 và chiều dài cũng là 10, căn bản bạn sẽ thấy một hình vuông màu vàng. Bây giờ bạn thử thay vào đó vài con cá khác màu xanh theo dạng hình chữ H bạn sẽ nhận ra ngay chữ H xanh trong một khung hình vàng. Chúc mừng bạn, bạn đã tạo một tệp ảnh động rồi đó...
Một điểm cần chú ý nữa đó là transparency (vô sắc).Transparency có khả năng tẩy „clear“ pixel. Trong trường hợp bạn muốn giấu mấy con cá vàng, bạn chỉ cần đổi chúng thành vô sắc, sau đó bạn chỉ còn thấy chữ H màu xanh bao bọc bởi một màu trắng do transparency kết nối lại với nhau.

Image-formate
Cấu trúc, được html hiện thị lên web-site để biểu diễn hình ảnh luôn là một liên đới tĩnh (relativ statisch ). Dạng hình đã thay đổi chút ít trong những năm qua. 3 dạng hình quan trọng thường đựơc dùng là gif, jpeg, png.
GIF được viết tắc từ Graphics Interchange Format. Vài năm trước đây gif rất được sử dụng phổ biến, bởi tính năng vô sắc ( transparency ) của nó. Dạng màu của Gif được kết hợp bởi 8-bit, do đó bạn chỉ có thể có 256 màu trong một tệp ảnh duy nhất.
Do ảnh hưởng của sức chứa màu, ảnh Gif chủ thích hợp với những khung có diện tích lớn.
Trong những năm gần đây Unisys Corporation, chủ quyền của LZW compression, người toàn quyền về việc sử dụng dạng hình gif, đã mất quyền chuyên giữ (patent) vào khoảng tháng 6 2003, nên giới sử dụng dạng gif cũng giảm xuống rất nhiều.

JPEG, Joint Photographic Experts Group, một dạng hình thích hợp cho ảnh chụp.Dạng jpeg không có vô sắc màu, nên nó không thích hợp với các toolbars hay Form không có góc cạnh.
PNG, Portable Network Graphics, một dạng dình mới được hổ trợ bởi nhiều trình duyệt. PNG có nhiều điểm lợi gần như của gif cộng cả tính vô sắc màu. Điểm cần chú ý PNG không biểu hiện rỏ ràng trên trình duyệt của netscape 4, nhưng mọi trình duy hiện tại đều diễn đạt tốt. Bạn nên thử loại hình này trong mọi trình duyệt xem nó có thích ứng không.
Thủ thuật biến đỏi ảnh bằng PHP
GD là một ANSI-C thư viện cho việc tạo lập hình ảnh động. Tương tự như php, thư viện gd là một mã nguồn mở của boutell.com bạn có thể vào đây để tải nó xuống nếu trong php chưa có thư viện này ( tôi nghĩ rằng không, php đã cài sẳn nó rồi, cảm ơn trời phật :-))
Installation thư viện GD: chỉ nói ngắn gọn.
xem trong file php.ini. Tìm dòng ;extension=php_gd2.dll bỏ dấu „ ; „ và start apache là ok. Muốn cho chắc chắn thì vào trình duyệt gọi tệp này xem tv GD đã bật chưa.
GD-API bao gồm nhiều function, giúp bạn tạo, sửa các tệp tin hình ảnh qua lập trinh php.API rất bao la và không chỉ vỏn vẹn trong phần tạo ứng nhỏ trong bài này. Chúng ta tập trung vào 4 điểm quan trọng :
-Phương thức cơ bản (basic funtions)
-Sảo thuật màu (color manipulation)
-Vẽ hình (drawing primitive shapes)
-Vẽ chữ ( working with text)

the basic function
Chúng ta bắt đầu với cốt lõi của function và dùng nó để tạo hình trong bất kỳ server-graphic nào. Function này sẽ nạp (load ) hình từ máy, lưu giử vào bộ phận nhớ ( memory) sau đó ghi hình vào đĩa cứng (disk) hay chuyển (streaming) đến trình duyệt.
Creating Images
Bạn có thể dùng function imagecreate () để tạo một nguồn ảnh mới để chỉnh đổi. Cách gọi : Ressource imagecreate (int x_size, int y_size) .
Function imagecreate() trả lại cho chúng ta nguồn (resource) tương đương với ảnh hình giống như cú pháp của mysql mysql_connect() trả cho chúng ta một mảng dử liệu ( recordset), nhưng bạn không thể sử lý trực tiếp vào biến này được, ở đây có liên quan đến funtion làm biến đổi hình ảnh, do đó nó sẽ vận chuyển source của ảnh đến funtion image để làm việc này. Function sẽ cho ta kết quả của ảnh ở độ phân giải x_size và y_size.

Sử dụng ảnh đã có (Using Existing Images)
Để tạo một ảnh trống (blank image) , chúng ta có thể lấy ảnh từ disk qua các funtions sau:
resource imagecreatefromjpeg (string filename) // ảnh dạng jpeg
Ressource imagecreatefrompng (string filename) // ảnh dạng png
Nhiều tương tự như funtion imagecreate(). 2 Funtions này trả cho ta giá trị của nguồn ảnh tương đương với tệp ảnh trong disk , nếu nó là true. Nguợc lại funtion trả một chuỗi trống ( empty string) nếu là false. Nếu fopen-wrappers' được bật lên ( có thể chỉnh sửa trong tệp tin php.ini) bạn có thể dùng URL như tên của tệp ảnh.
Nhưng coi chừng máy sẽ chạy chậm đi vì phải tìm chất liệu qua HTTP. Mỗi khi 1 chức năng dùng URL thay vì một hồ sơ trên đĩa, chức năng script phải tìm qua mạng lưới. Vì qua mạng lúc nào cũng chậm hơn là đi thẳng từ đĩa nên máy chạy chậm đi là 1 quan tâm ở đây.
fopen_wrappers chạy tốt với php trên nền unix và cũng được chỉnh sửa trên nền Windows kể từ phiên bản (vers.) 4.3.

Truy tìm kích thước của tệp ảnh ( Finding an Image's Size)
Rất nhiều điểm lợi khi ứng dụng web cho ta biết kích thước của ảnh. Chúng ta có thể sử dụng thông tin này:ví dụ cần kích thước chính xác của ảnh để làm một popup-window cho một thư viện ảnh hoặc đặt ảnh theo chiều cao, rộng trong tag.
Array getimagesize ( string filename [, array imageìno])
funtion getimagesize() trả về cho ta 4 phần tử (elements) array là:
element 0: độ ngang của ảnh trỏ về tham số pixels của tệp ảnh
element 1: độ cao của ảnh trỏ về tham số pixels của tệp ảnh
element 2: trị số (interger) tương đương cho loại ảnh (typ image) (1=gif, 2=JPG, 3=PNG)
element 4: chuỗi gắn thêm (add) vào tag để biểu hiện độ cao rộng, vd: „height=100 width=200“
Tham số (parameter) của tệp ảnh dự bị được chuyển đưa đến dãy array nhằm lấy thêm những thông tin của ảnh. Khi họat động nó trả lại một JPG APP (nhờ thằng google nó giải thích giùm là cái gì nhá) khác nằm trong một associative array.
Truy lùng độ phân giả cao rộng ( retrieving the width and height)
Nếu chúng ta cần đến độ cao rộng của ảnh chúng ta không cần đo thông tin ảnh trong mãng array một cách khó khăn.
Chúng ta có thể sử dụng funtion imagesx() và imagey() để truy tìm độ cao rộng của tệp ảnh.
Int imagex ( resource image)
Int imagey ( resource image)
Như đã thấy funtions imagex và imagey trả cho ta giá trị của độ cao và rộng của tệp ảnh. Cũng cần lưu ý function này không giống như function getimagesize trên. 2 functions này chỉ lấy nguồn ảnh (resource) , chứ không phải đường dẫn của ảnh (file path). Muốn tạo ảnh bạn nên dùng funtion imagecreate() trước sau đó đến 2 function imagex() và imagey() để lấy tham số của ảnh do imagecreate() tạo.

Copy và Bóp ảnh ( copy & resizing an a image)
Chúng ta có thể dùng coy và resize để tạo ảnh mới. Function này rất lợi cho việc làm thư viện hình ảnh như thubmnails...
int imagecopyresized (resource dst_im, resource src_im,
int dstX, int dstY,int srcX, int srcY,
int dstW, int dstH, int srcW, int srcH)
Function này copy phần góc (rectangular) của nguồn ảnh và trao trả chúng đến đích của ảnh thật.
dst_im, src_im – the destination and source image resources
int dstX, int dstY – the upper-left corner of the replaced content in the destination image
int srcX, int srcY – the upper-left corner of the source content in the source image
int dstW, int dstH – the width and height of the rectangular area to replace in the destination image
int srcW, int srcH – the width and height of the rectangular area to copy in the source image
Nếu trong phạm vi góc thì không tương ứng với độ cao rộng trong khoảng giữa nguồn ảnh và đích ảnh. Function này họat động tương đối nó có thể copy từng vùng (regions) với cùng lọai ảnh (same image) (vd: dst_im tuơng ứng với src_im ). Tuy nhiên nếu vùng ảnh(régions) nằm trên vùng đã có kết quả (results) thì ta không thể liệu trước được.
Cho ảnh hiệ thị trên trình duyệt ( outputting to the browser)
Khi đã chỉnh sửa ảnh xong, chúng ta cần tìm giải pháp cho ảnh hiện trên trình duyệt. Để làm việc này chúng ta dùng function imagepng() and imagejpeg()
int imagepng (resource image [, string filename])
int imagejpeg (resource image [, string filename])
function này xuất dữ liệu nguyên thủy (raw) của ảnh đến trinh duyệt. Nếu nguồn ảnh là một tên tệp (file name) , nó sẽ được ghi chép mọi thông tin vào tệp ảnh. Tên tệp phải nằm trong đĩa cứng (disk) và php phải có toàn quyền (chmod 777) để sao chép tin tệp. Ta cần dùng funtion header() trong trình duyệt khi muốn đưa ảnh hiện thị.
Xóa bỏ bộ nhớ ( Reclaiming used Memory)
Sau giao chuyển hình đến trinh duyệt chúng ta cần loại bỏ đi phần tồn trong bộ phận nhớ qua function : imagedestory().
int imagedestory ( resource image)

Cách sử dụng căn bản
Để dùng function này chúng ta cần tạo một thubmnail để nạp (load) hình và kéo nhỏ xuống 1/8 so với ảnh nguyên thủy , kế đến lưu vào đĩa.
PHP Code:
   //load the image into memory and get its properties
   
$img imagecreatefrompng("goldengate.png");
   
$imgsz getimagesize("goldengate.png");
  
   
//create new image for thumbnail 1/8 the size of the original
   
$thumb imagecreate($imgsz[0]/8$imgsz[1]/8);
  
   
//shrink the original image to 1/8th its size
   
imagecopyresized($thumb$img0000
$imgsz[0]/8$imgsz[1]/8$imgsz[0], $imgsz[1]);
  
   
//write the thumbnail to disk
   
imagepng($thumb"goldengate_thumb.png");
  
   
//get the image size of the thumbnail for use in the HTML below
   
$thumbsz getimagesize("goldengate_thumb.png");
  
   
//free resources occupied by the images
   
imagedestroy($img);
   
imagedestroy($thumb);
?>

  
     echo $imgsz[3?>>
     echo $thumbsz[3?>>
   
Pha màu (Working with Color)

Ngoài cách sử dụng những function trên khi đã có một nguồn ảnh bạn cũng sẽ muốn biến đổi chúng đôi chút thay vì chỉ bóp ảnh nhỏ lại. Có lẽ bạn đã ít nhiều quen biết với nhiều loại màu sắc.Như cấu trúc của html, thư viện GD xem màu sắc như một màu tổng hợp bởi xanh, đỏ, vàng. Chúng ta có thể hoán đổi giá trị màu qua thông số hexadecimal biến chúng thành một màu thích hợp. Màu ở dạng html số đầu có hai digits là đỏ (red), kế đến là xanh lá (green)cây sau cùng là màu xanh đậm(blue).Xem giá trị màu của bảng dưới đây:
Color Html hexadecimal GD Triple Representation
Black #000000 (0,0,0)
White #FFFFFF (255,255,255)
Red #FF0000 (255,0,0)
Yellow #00FFFF (0,255,255)
Purple #FF00FF (255,0,255)

chúng ta sẽ sử dụng funtion này trong những bài tới:
Tạo hình cơ bản và sử dụng font chữ để viết text.Cách sử dụng trực tiếp qua function này là dùng công cụ đồ họa.

Hòa màu ( Adding a color to the Palette)

Để hòa màu trong tệp ảnh, bạn cần biết xác định màu trong bảng sắc màu (palette). Function imagecolorallocate() sẽ phân phối màu một cách chính xác, rõ rệt vào trong bảng màu này.
Câu lệnh : int imagecolorallocate(resource image, int red, int green, int blue)
funtion imageallocate() dùng ba màu sắc (red, green, blue) để hòa màu cho ảnh nguồn, đồng thời ảnh nguồn này phải do function imagecreate() hay funtion imagecreatefrom() tạo ra. Giá trị của màu red, green, blue phải là giá trị của mã số (int) khoảng 0 và 255.Funtion này trả giá trị -1, nếu toàn vùng ảnh nguồn (allocation) không được thực hiện đúng. Trong thực tế người ta sử dụng các biến có cùng màu tương tự cho vùng màu. Màu đầu tiên của toàn vùng sẽ là màu của nền (background color).
Vd: $darkred = imagecolorallocate($myImage, 186, 0, 0);

Lấy màu từ ảnh nguồn (retrieving a color from an existing image)

Muốn lấy màu từ một điểm chính xác trong một tệp ảnh, ta cần phối hợp của nhiều functions.
Vd: int imagecolorat (resource image, int x, int y)
array imagecolorsforindex (resource image, int index)
funtion trả về một chỉ điểm (index) cho bảng màu(palette) ở một tụ điểm chính xác (x,y) trong tệp ảnh nguồn. Tuy nhiên function sẽ không trả màu thật (màu hiện tại actual color). Bảng màu không chỉ là một dãy màu (array of color).
Vd hình có 8bit thì màu sẽ được lưu trong một array hay một bảng bao gồm 256 màu. Funtion imagecolorsforindex() trả lại một associative array cho giá trị của các màu red, green và blue.
Vd: $colorIndex = imagecolorat($myImage, $x, $y);
$colorArray = imagecolorsforindex($myImage, $colorIndex);
printf('Red: %d Green: %d Blue: %d', $colorArray['red'],
$colorArray['green'], $colorArray['blue']);

Lấy đúng màu ( getting the closest Match for a color)

Khi gặp phải bảng màu không thích hợp (confined palette), thỉnh thoảng ta nên dùng màu tương đối thích hợp thay vì dùng một màu mới khác hoặc
bởi lúc phân phối màu cho tệp ảnh đã làm tăng độ nặng cho tệp ảnh này, hoặc nếu không còn chỗ chứa cho bảng màu nữa.
Vd: Int imagecolorclosest (resource image, int red, int green, int blue)
Imagecolorclosest()trả giá trị của màu kế tiếp đến bảng màu đồng thời ấn định rõ rệt 3 thể lọai màu RGB.

Xóa màu trong Palette ( Removing a color from the Palette)

Nên xóa bỏ các loại màu trong bàng nếu không cần đến chúng nữa. Function imagecolordeallocate() có chức năng này.
Vd: int imagecolordeallocate (resource image, int color)
Function này có thể làm dạng màu trong tệp ảnh trở lại như màu của index trong bảng màu để có thể sử dụng lại như lúc ban đầu. Cách họat động của function imagecolorallocate() là thay đổi màu trong mỗi pixel cho tương ứng với index của palette màu.

Thay đổi màu ( Altering a Color)

Để thay đổi màu cho tệp ảnh, ta có thể thay đổi trụec tiếp qua bảng màu(palette)
vd: bool imagecolorset (resource image, int index, int red, int green, int blue)
Sự thay đổi màu trong palette được đặt tại điểm index của 3 màu RGB. Function này rất có lợi khi thay đổi màu ở một khoàng lớn mà không cần tốn nhiều màu để đổ (flut fill)
Tổng kết số lượng màu đã dùng ( Couting How many Colors are used)
Để tổng kết số lượng màu trong một tệp ảnh ta cần đến function này :
int imagecolorstotal (resource image)
Funtion này trả cho ta một luợng màu trong palette ảnh.

Làm màu vô sắc ( Making a transparent Color)

Muốn tạo một vùng màu nhất định nào đó ta có thể sử dụng function này :
vd: int imagecolortransparent (resource image [, int index])
Funtion này lấy màu từ trong palette chính xác là index của bảng màu và chuyển đổi nó thành transparent. Vô sắc màu này là thuộc tính của ảnh bảng (image palette) chứ không phải của pixel. Một khi màu đã được chuyển đổi sang transparent thì trong tương lai tệp ảnh cũng sẽ có dạng transparent. Sử dụng màu khác biệt ví dụ như màu tím (magenta) với màu xanh(green), lý do nó giúp ta phân biệt dễ dàng trong lúc thao tác. Nếu bạn muốn sử dụng transparent, bạn nên đổi nó sang dạng được hổ trợ transparency ví dụ như :PNG , GIF. Thuộc tính transparency sẽ bị hủy nếu bạn đổi nó thành dạng JPG.

Tạo hình căn bản (Creating primitive Shapes)

Giờ chúng ta đã có vùng màu trong tệp ảnh của chúng ta. Chúng ta có thể sử dụng màu để tạo hình trong tệp ảnh. Thư viện GD có những funtion để vẽ đường thẳng (line) và hình tròn (circle) cũng như hình đa giác (polygons). Chúng ta có thể dùng phồi hợp (coordinate system) chính xác một điểm, nơi tv GD tạo cho ta một form hình. Chúng ta có thể tạo hình từ khởi đầu hoặc chỉnh sửa một hình đã có sẳn.

Đường thẳng (Lines)
Đường thẳng là lọai hay được dùng nhầt trong đố họa hình.
Câu lệnh : int imageline (resource image, int x1, int y1, int x2, int y2, int col)
Funtion này tạo một đường thẳng trong một cột vô nguồn hình từ điểm (x1,y1) tới (x2, y2). Để vẽ một đường thăng đỏ đậm trên một tấm ảnh khoảng độ 200 x 200 từ bên trên tay trái xuống chéo phía dưới bên phải chúng ta có thể dùng funtion sau: $ Bordeaux = imagecolorallocate ($ myImage, 186, 0, 0); imageline ($ myImage, 0, 0, 199, 199, $ bordeaux);

Hình chữ nhật (Rectangles)
Cách tạo cũng tương tự như trên, tạo một hình chữ nhật: Int imagerectangle (resource image, int x1, int y1, int x2, int y2, int col) int imagefilledrectangle (resource image, int x1, int y1, int x2, int y2, int col)
funtion này kẻ tạo một hình vuông. Góc trái phía trên là điểm (x1,y1), góc phải bên dưới là điểm (x2,y2). Trong trường hợp này (x2>x1) điểm này được tiềp tục kéo dãn về phía phải và (y2>y1) điểm này được tiếp tục kéo dãn xuống dưới. Qua các thông tin của hình ta có thể nhận ra cách đọc của code nhằm tránh những lỗi có thể xẩy ra.

Hình Góc (Polygons)
Thư viện GD cho phép ta tạo ra nhiếu mẫu hình góc như hình tam giác và hình lục giác.
Câu lệnh:Int imagepolygon (resource image, array points, int num_points, int col) int imagefilledpolygon (resource image, array points, int num_points, int col)
funtion này tạo một đường ngoài bao bọc sau đó tô thành một đồi tượng hình tương ứng. Nều bạn muồn tạo một hình đa góc có nhiếu điểm. Đầu tiên Thư viện GD sẽ tạo đặt thành hình đa góc và kết nối chúng từ những đọan thẳng từ điểm đầu tiên lần đến điểm cuồi cùng. Điểm số (Num_points) phải nhỏ hơn hoặc bằng đường thẳng đứng của hình góc. Nếu điểm số (num_points) lớn hơn số của đường thẳng đứng, funtion sẽ thảy ra một lỗi, lý do funtion không đủ thông tin để đáp ứng tạo một hình góc (polygons).
Nều num_points nhỏ hơn số của đường thẳng, hình góc sẽ giao trả lại cho đọan thẳng với num_points đó và điểm đầu và cuối không đựơc kết hợp, đương nhiên sẽ không có kết quả cho việc tạo hình. Dãy array là trung gian (vector) của điểm làm thay đổi giá trị giữa kết hợp của x và kết hợp của y. Để vẽ một tam giác chúng ta cần sử dụng code sau: $darkgreen = imagecolorallocate($myImage, 0, 67, 0);
$myPoints = Array(10, 10, 10, 60, 60, 60);
imagepolygon($myImage, $myPoints, 3, $darkgreen);
Đọan code trên tạo nên một (ellipse) ở các điểm (cx,cy) với cạnh ngang là w và cao là h. Php không có funtion để tạo hinh tròn. Đê giải quyết vấn đề này nó cần một funtion đặt biệt. Nếu như chiều ngang bằng với chiều cao ellipse sẽ biến thành một hình tròn. Kể tư vers php4.0.6 php đã cài đặt funtion này vào và cấn có thư viện GD vers.2.0.1

Tạo hình võng (Arcs)
funtion arc được kế thừa từ funtion ellipse. Chúng có thể tạo một phần (partial) cho ellipse
câu lệnh:int imagearc (resource image, int cx, int cy, int w, int h, int s, int e, int col)
int imagefilledarc (resource image, int cx, int cy, int w, int h, int s, int e, int col, int style
Funtion này tạo một hình võng có tụ điểm ở (cx, cy) của chiều ngang và cao. Điểm khởi đầu và điểm cuối s, e là đường biểu diễn tương ứng với điểm đầu và cuồi trong góc độ của hình võng.Góc độ zero tương ứng với vị trí 3 giờ của đồng hố. Php vẽ hình võng theo chiều kim đồng hồ. Góc 90 độ sẽ là 6 giờ, 180 độ sẽ là 9 giờ v.v...funtion này có trong php4.0.6 và cần thư viện GD 2.0.1.
funtion Imagefilledarc() có tham sồ cộng theo cách sau:
IMG_ARC_PIE – Produces a rounded edge and fills in the arc like that of a pie graph.
IMG_ARC_CHORD – Connects the starting and ending points with a straight line and fills in the resulting triangle.
IMG_ARC_NOFILL – Suspends the filling of the arc.
IMG_ARC_EDGED – Paints the edge of the arc. Used in conjunction with IMG_ARC_NOFILL to make an outlined pie slice.

Tô màu (Fills)
Chúng ta có thể đổ màu cho một hình kỳ hoặt bằng kỷ thuật đổ màu ập (flood filling)
câu lệnh: int imagefill (resource image, int x, int y, int col)
int imagefilltoborder (resource image, int x, int y, int border, int col)
function này làm thay đổi màu của các pixel trong toàn diện vùng thành màu trong col. ImageFillToborder() chỉ tô màu cho các cạnh (border).

Cách sử dụng một form hình đơn giản
Chúng ta đã biết sơ qua lý thuyêt cơ bản để làm việc với hình ảnh đơn giản. Hãy xem một ví dụ nhỏ về cách họat động của function trong thực tế.



PHP Code:
header('Content-Type: image/png');

//Tạo một ảnh nguồn có độ phân giãi 300 X 300 pixel:
$myImage imagecreate(300300); 

//tạo màu trắng đen trong ảnh. Màu đen là màu nền. Nó đã được cài sẳn lúc đầu rồi.
$black imagecolorallocate($myImage000);
$white imagecolorallocate($myImage255255255);

//Cho màu trắng vào hình (rectangle) ở trung tâm của ảnh sẽ tạo ra một ảo ảnh đen của cạnh(border).
imagefilledrectangle($myImage2525275275$white);

//gạch chính giữa hình (ectangle) một đường thẳng từ trên xuống dưới. Ta biết đường thẳng sẽ là x1 = x2.
imageline($myImage15030150270$black);

/*Cài một lọat điểm cho hình rectangle. Hình rectangle sẽ đậy toàn vùng qua các thông sô  (50,50), (50,100),(100,100). Nếu ta cho dãy số vào function imagepolygon() và cho chúng biết hình triangle có 3 đường thẳng đứng.Chúng ta đã vẽ một hình chữ nhật có hình dáng tương tự như trước đây.
*/

$myTriangle = array (505050100100100);
imagepolygon($myImage$myTriangle3$black);
imagerectangle($myImage50150100250$black);

/* Chúng ta sẽ tô hình, đường thẳng đứng kéo dãn hình ellipse. Chúng ta biết ellipse được kéo dãn thằng tuột do h>w. Trong ví dụ này chiều cao là 100 và chiều ngang là 50.
*/

imagefilledellipse($myImage22520050100$black);

//Cuối cùng là vẽ hình Pac-Man-style ellipse với function imagefilledarc().
imagefilledarc($myImage22575505045315$blackIMG_ARC_PIE);

// cuối cùng chúng ta gởi hình đến trình duyệt và xóa bộ nhớ.
  
imagepng($myImage);
  
imagedestroy($myImage);?>
cho script chạy chúng ta sê nhận được một hình vẽ như sau: 
Vẽ chữ ( Working with text)

Vẽ chữ là phần cuồi trong tutorial, chúng ta sẽ đào sâu hơn trong ứng dụng server-generate graphics. Chúng ta cùng nhau thảo luận thêm từ các bài trên qua các ví dụ vừa rôi.
Vẽ chữ (adding text) là một trong những ứng dụng được xài nhiều nhầt trong server-generate graphics. Những công việc như tạo buttons nhàm chán giống như công việc nhà được thực hiện một cách máy móc. Tạo nút tự động có 2 điểm lợi: Thay đổi một lấn là có thể sử dụng khắp nơi và hình được lưu gữi ở một nơi cái rẩt lợi vế mặc sử lý ít khi gặp lỗi.
Chún ta tập trung vào việc sử dụng font chữ TrueType và các thiềt kề những font chữ khác. Dạng trueType là dạng chữ chuẩn ( standard- outline), khởi nguồn từ Appel Computer và sau này là Microsoft trong hệ windows 3.1. font chữ của windows được cài đặt trong thư mục c:\windows \fonts hay c:\winnt\ fonts. Thường font chữ có đuôi như sau: TTF. Bạn có thể vào đây để biết thêm chi tiết : www.freetype.org. Trong PHP hệ windows nó được compiler theo dạng freetype trong thư viện GD.

ô Text ( textfield)
Function trả cho ta một bounding vuông vức(box) bao bọc bởi chữ. Để tính toán độ lớn nhỏ của hình nền (background) hay một vùng ta dùng function này để đặt chữ vào đó
câu lệnh: array imagettfbbox (int size, int angle, string fontfile, string text)
Nó bao gốm 4 tham sồ : cở chữ được kết tụ bởi các điểm, góc của text được tạo tại điểm ngang tương đối,
đường dẫn tuyệt đối đền font chữ và tạo text . Đường dẫn trong hệ unix phải hoàn tòan đầy đủ (full path), đối với hệ windows tương đối dễ hơn có thê xài đường dẫn full hay relative tùy ý. Function này trả một dãy array có 8 giá trị (values):
returnArray[0] – lower-left corner, X position
returnArray[1] – lower-left corner, Y position
returnArray[2] – lower-right corner, X position
returnArray[3] – lower-right corner, Y position
returnArray[4] – upper-right corner, X position
returnArray[5] – upper-right corner, Y position
returnArray[6] – upper-left corner, X position
returnArray[7] – upper-left corner, Y position
Tất cả vị trí của array này đều tương đối với góc lower-left. Giá trị dương nằm ở phía dưới bên phải. Ngược lại giă trị âm nằm ở vị trí trên bên trái và thẳng lên từ điểm nguyên thủy (original). Nếu (x,y) nằm góc trái (lower-left), thì (x+$returnArray[6], y+$returnArray[7]) nằm bên góc trên (upper-left).

Text
Để giao trả một text đến tệp ảnh trong bộ nhớ ta cần gọi function imagegettext()
array imagettftext (resource image, int size, int angle, int x, int y, int col, string
fontfile, string text)
Không giống như những function khác, Liên kết (x,y) trỏ xuống phía dưới bên trái (bottom left) hay điểm căn bản của ký tự đầu tiên. Góc là góc độ từ 0 trỏ đến đường ngang của text và giá trị chiều cao diễn tả theo chiều kim đồng hồ. Vd: góc 270 độ tạo một text từ trên xuống dưới. Tệp chữ là đường dẫn đến font chữ trueType mà bạn cần đến. Text là chuỗi ký tự để tạo. Bạn cũng nên dùng utf-8 để diễn đạt đựợc nhiều ký tự có dạng như { chẳng hạn. Giá trị được trả cũng tương tự như của function imagettfbbox().

Cách sử dụng text
Xem ví dụ này để xem có liên quan dến nhau như thế nào imagettfbbox() và imagettftext().
 
PHP Code:


/* Trong các ví dụ trước , chúng ta đã sử dụng http header để chuyển gởi ảnh tới trình duyệt.
Tiếp đến chúng ta tạo một source ảnh có kích thước 300x300 pixel và tạo hai màu trắng đen cho vùng ảnh.
*/

header('Content-Type: image/png');
$myImage imagecreate(200200);
$black imagecolorallocate($myImage000);
$white imagecolorallocate($myImage255255255);

/* tính toán vùng ảnh và dùng imagettfbbox() để tạo chữ.
Chú ý đường dẫn đến font chữ trong hệ thống của bạn.
*/

$boundingbox imagettfbbox(250'/usr/local/fonts/arial.ttf''Hello Greg');

// dán text „ Hello phpvn“ vào. Sử dụng cở chữ (size) là 25 kiểu chữ arial.ttf, chữ trắng nằm ngang (ở góc độ =0), 
imagettftext($myImage2501050$white'arial.ttf''Hello phpvn');

/*Để vẽ một hình chữ nhật ta dùng function imagettfbbox(), function này tạo cho ta một bounding box.
Imagerectangle() họat động kết hợp với upper-left và lower-rigth. Chúng ta có thể sử dụng array để tính các điểm này.
*/

imagerectangle($myImage10+$boundingbox[6], 50+$boundingbox[7],
 
10+$boundingbox[2], 50+$boundingbox[3], $white);

// lập lại 3 bước sau cho góc của text 

$boundingbox imagettfbbox(2545'arial.ttf''Hello phpvn');
imagettftext($myImage254530175$white'arial.ttf''Hello phpvn');
imagerectangle($myImage30+$boundingbox[6], 175+$boundingbox[7],
30+$boundingbox[2], 175+$boundingbox[3], $white);

// run script và xóa bộ nhớ
  
imagepng($myImage);
  
imagedestroy($myImage);?>

Nguồn : SinhvienIT

0 nhận xét: