2012-03-15 31 views
5

Tôi đang cố gắng in nhiều dòng văn bản trên hình ảnh và căn giữa để căn chỉnh chúng.Trung tâm căn chỉnh nhiều dòng văn bản với GD và PHP

ví dụ:

        Đây là
Một chuỗi văn bản

Ngay bây giờ, tôi chỉ có vị trí bên trái cho toàn bộ chuỗi. Có bất kỳ phím tắt nào để làm việc đó không? Tôi nghĩ rằng nó có thể phải là một getttfbox trên toàn bộ chuỗi, sau đó một phát nổ trên ngắt dòng, sau đó trung tâm văn bản mới bên trong ttfbox lớn hơn. Đó là một cơn đau ở ass ...

EDIT: đã đưa ra một giải pháp:

foreach ($strings as $index => $string) { 
     $parts = explode ("\n", $string['string']); 
     if (count ($parts) > 1) { 
      $bounds = imagettfbbox (intval($string['fontsize']), 0, $font, $string['string']); 
      $width = $bounds[2] - $bounds[0]; 
      $height = $bounds[3] - $bounds[5]; 
      $line_height = $height/count ($parts); 

      foreach ($parts as $index => $part) { 
       $bounds = imagettfbbox (intval($string['fontsize']), 0, $font, $part); 
       $new_width = $bounds[2] - $bounds[0]; 
       $diff = ($width - $new_width)/2; 
       $new_left = $string['left'] + $diff; 

       $new_string = $string; 
       $new_string['left'] = $new_left; 
       $new_string['top'] = $string['top'] + ($index * $line_height); 
       $new_string['string'] = $part; 
       $new_strings[] = $new_string; 
      } 
     } 
    } 

    if ($new_strings) 
     $strings = $new_strings; 

Trong trường hợp này, mỗi $ string là một mảng với một số thông tin về cách thức và những gì để in. Hy vọng rằng sẽ giúp ai đó.

+0

Xin đừng sửa câu trả lời của bạn vào câu hỏi của bạn nhưng thay vì viết một câu trả lời mới (và chấp nhận nó, nếu thats giải pháp mà làm việc cho bạn). – darthmaim

Trả lời

2

Dưới đây là một chức năng sẽ sử dụng imagettfbbox bạn đã đề cập, tôi không thể giúp với wordwrapping tự động, nhưng có lẽ như bạn đề nghị, chia chuỗi trước thời hạn.

function imagettftext_cr(&$im, $size, $angle, $x, $y, $color, $fontfile, $text) 
{ 
    $bbox = imagettfbbox($size, $angle, $fontfile, $text); 
    $dx = ($bbox[2]-$bbox[0])/2.0 - ($bbox[2]-$bbox[4])/2.0; 
    $dy = ($bbox[3]-$bbox[1])/2.0 + ($bbox[7]-$bbox[1])/2.0; 
    $px = $x-$dx; 
    $py = $y-$dy; 
    return imagettftext($im, $size, $angle, $px, $py, $color, $fontfile, $text); 
} 

Edit: Ngoài ra các mặt hàng này trong các ý kiến ​​tài liệu PHP ...

Dưới đây là một chức năng đơn giản để bọc văn bản đi vào một hình ảnh. Nó sẽ quấn lên nhiều dòng như nó cần, nhưng góc $ phải bằng không. Tham số chiều rộng $ $ là chiều rộng của hình ảnh.

function wrap($fontSize, $angle, $fontFace, $string, $width) 
{ 
    $ret = ""; 
    $arr = explode(' ', $string); 
    foreach ($arr as $word) 
    { 
    $teststring = $ret.' '.$word; 
    $testbox = imagettfbbox($fontSize, $angle, $fontFace, $teststring); 
    if ($testbox[2] > $width){ 
     $ret.=($ret==""?"":"\n").$word; 
    } else { 
     $ret.=($ret==""?"":' ').$word; 
    } 
    } 
    return $ret; 
} 
+0

Vấn đề là, nó không được căn giữa vào chính hình ảnh, nó được căn giữa so với các dòng văn bản khác. tức là hình ảnh có thể rộng 500px, bên trái của văn bản có thể là 100px, chiều rộng văn bản có thể là 150px và có 2 dòng và văn bản phải được căn giữa trên chính nó. –

+0

Sau đó, tôi sẽ đoán bạn sẽ cần dòng bởi imagettftext_cr() như bạn đã đề cập. http://php.net/manual/en/function.imagettftext.php tìm kiếm bài đăng của "sk89q" trên 14-Mar-2008 03:36 – Scuzzy

+0

Vâng, nó không chính xác những gì tôi cần. Thật tuyệt, tôi có thể viết hàm, tôi chỉ hy vọng một ai đó sẽ có một phím tắt –

-1

Lấy chiều dài của chuỗi (strlen), và có chiều rộng trung bình của mỗi lá thư, nhân kết quả strlen bởi chiều rộng trung bình và sau đó trừ đi từ vị trí nằm ngang của bạn.

$text="center this"; 
$h=50; 
$h=(strlen($text)*15)-$h; 

Nói cho tôi biết nếu nó hoạt động bởi vì tôi chưa bao giờ cố gắng này

+0

Điều đó sẽ không thực sự cắt cho những gì tôi đang cố gắng làm. Cảm ơn mặc dù. –

1

Bạn có thể sử dụng gd-text thư viện xuất sắc. Nếu bạn sử dụng nhà soạn nhạc, một ví dụ có thể là thế này:

<?php 
require __DIR__.'/../vendor/autoload.php'; 

use GDText\Box; 

$im = imagecreatetruecolor(500, 500); 
$backgroundColor = imagecolorallocate($im, 0, 18, 64); 
imagefill($im, 0, 0, $backgroundColor); 

$box = new Box($im); 
$box->setFontFace(__DIR__.'/Pacifico.ttf'); // http://www.dafont.com/pacifico.font 
$box->setFontSize(80); 
$box->setFontColor([255, 255, 255]); 
$box->setTextShadow([0, 0, 0, 50], 0, -2); 
$box->setLeading(0.7); 
$box->setBox(20, 20, 460, 460); 
$box->setTextAlign('center', 'center'); 
$box->draw("Pacifico"); 

header("Content-type: image/png"); 
imagepng($im); 
4

Bạn có thể sử dụng stil/gd-text lớp. Disclaimer: Tôi là tác giả.

<?php 
use GDText\Box; 
use GDText\Color; 

$img = imagecreatefromjpeg('image.jpg'); 

$textbox = new Box($img); 
$textbox->setFontSize(12); 
$textbox->setFontFace('arial.ttf'); 
$textbox->setFontColor(new Color(0, 0, 0)); 
$textbox->setBox(
    50, // distance from left edge 
    50, // distance from top edge 
    200, // textbox width 
    100 // textbox height 
); 

// now we have to align the text horizontally and vertically inside the textbox 
$textbox->setTextAlign('center', 'top'); 
// it accepts multiline text 
$textbox->draw("This is\na string of text"); 

diễn:

demo

+0

Tôi đã tải xuống mã của bạn. Nó hoạt động hoàn toàn tốt đẹp, nhưng có lẽ một trong những lý do tại sao không nhiều người đang sử dụng nó, là bởi vì nó có và tải xuống rất nhiều phụ thuộc! hệ thống của bạn để sắp xếp hộp là nặng hơn khách hàng và máy chủ của plataform của tôi với nhau. nếu bạn bằng cách nào đó có thể làm cho nó hoạt động mà không có nội dung của/vendor /, giống như phương pháp đứng một mình hoặc một hàm, thì bạn sẽ có một cái gì đó tuyệt vời. –

Các vấn đề liên quan