2010-09-09 10 views
6

Tôi đang sử dụng imagettftext để thực hiện một thanh đồ thịđồng đầu mỗi thanh Tôi muốn đặt giá trị.PHP sắp xếp vào giữa GD ttftext

Tôi có biến sau cho mỗi thanh (mà thực sự hình chữ nhật)

$x1 $y1 $x2 $y2 $imagesx $imagesy $font_size

Ngoài ra, The fontsize nên giảm như chiều dài chuỗi tăng lên.

alt text

+1

Boy, bạn đang ở cho một số công việc! Liệu nó * có * là PHP? Có những thư viện vẽ biểu đồ javascript tuyệt vời (và sẵn sàng) ở đó ... –

+0

Tôi đang tạo một thư viện PHP để ... –

+0

Sẽ rất hay khi có mã "làm biểu đồ thanh" cho mẫu, bạn có thể đăng nó không? – Otar

Trả lời

11

Làm như thế này. Hãy nhớ đặt file font "arial.ttf" trong thư mục hiện hành:

<?php 
// Create a 650x150 image and create two colors 
$im = imagecreatetruecolor(650, 150); 
$white = imagecolorallocate($im, 255, 255, 255); 
$black = imagecolorallocate($im, 0, 0, 0); 

// Set the background to be white 
imagefilledrectangle($im, 0, 0, 649, 149, $white); 

// Path to our font file 
$font = './arial.ttf'; 

//test it out 
for($i=2;$i<10;$i++) 
    WriteTextForMe($im, $font, str_repeat($i, $i), -140 + ($i*80), 70 + rand(-30, 30), -160 + (($i+1)*80), 150, $black); 

//this function does the magic 
function WriteTextForMe($im, $font, $text, $x1, $y1, $x2, $y2, $allocatedcolor) 
{ 
    //draw bars 
    imagesetthickness($im, 2); 
    imagerectangle($im, $x1, $y1, $x2, $y2, imagecolorallocate($im, 100,100,100)); 

    //draw text with dynamic stretching 
    $maxwidth = $x2 - $x1; 
    for($size = 1; true; $size+=1) 
    { 
     $bbox = imagettfbbox($size, 0, $font, $text); 
     $width = $bbox[2] - $bbox[0]; 
     if($width - $maxwidth > 0) 
     { 
      $drawsize = $size - 1; 
      $drawX = $x1 + $lastdifference/2; 
      break; 
     } 
     $lastdifference = $maxwidth - $width; 
    } 
    $size--; 
    imagettftext($im, $drawsize, 0, $drawX, $y1 - 2, $allocatedcolor, $font, $text); 
} 

// Output to browser 
header('Content-type: image/png'); 

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

Nó sử dụng imagettfbbox chức năng để có được chiều rộng của văn bản, sau đó vòng qua kích thước phông chữ để có được kích thước chính xác, trung tâm nó và hiển thị nó.

Vì vậy, nó kết quả đầu ra như sau:

alt text

2

Bạn có thể tính trung tâm của văn bản của bạn bằng cách sử dụng PHP imagettfbbox-function:

// define text and font 
$text = 'some bar label'; 
$font = 'path/to/some/font.ttf'; 

// calculate text size (this needs to be adjusted to suit your needs) 
$size = 10/(strlen($text) * 0.1); 

// calculate bar center 
$barCenter = $x1 + ($x2 - $x1)/2; 

// calculate text position (centered) 
$bbox = imagettfbbox($size, 0, $font, $text); 
$textWidth = $bbox[2] - $bbox[0]; 
$positionX = $textWidth/2 + $barCenter; 
$positionY = $y1 - $size; 

EDIT: Cập nhật mã để làm tất cả công việc cho bạn.

+0

Làm thế nào * chính xác * bạn sẽ sử dụng nó để có được nơi để viết nó để nó trở thành trung tâm –

+0

Tôi đã chỉnh sửa bài đăng của tôi cho phù hợp. Mã tính toán vị trí trục x của văn bản đã cho với căn giữa '$ positionX'. – jwueller

+0

Hmm hãy để tôi viết lại câu hỏi –