PHP GD - Подравнете текста централно хоризонтално и намалете размера на шрифта, за да го запазите в изображението

Надявам се, че се справяте страхотно.

Все още съм начинаещ с php, така че след като прочетох малко и докато проверявах някои публикации тук, успях да сложа малко текст върху изображение с функцията imagecreatefrompng(), използвайки PHP GD, потребителите ще стигнат до формуляр и ще бъдат мога да въведа тяхното име и името ще бъде написано върху изображението, за съжаление не успях да подравня текстовия център хоризонтално, опитах всички възможни начини (моите начини очевидно и трябва да са грешни) с imagettfbbox, но се провалих във всичките си опити , бихте ли ми помогнали малко да подравня центъра на низа хоризонтално? Освен това, тъй като използвам алтернативен голям шрифт, имам нужда от намаляване на размера, ако въведеното име е дълго, така че по този начин то няма да надхвърли ограниченията на изображението и ще остане в центъра. Получавам стойността на текста от формуляр, както можете да проверите в началото на моя код:

<?php
 $nombre=$_POST['nombre'];
  //Set the Content Type
  header('Content-type: image/jpeg');

  // Create Image From Existing File
  $jpg_image = imagecreatefromjpeg('fabian.jpg');

  // Allocate A Color For The Text
  $white = imagecolorallocate($jpg_image, 255, 255, 255);

  // Set Path to Font File
  $font_path = 'fabian.TTF';

  // Set Text to Be Printed On Image , I set it to uppercase
  $text =strtoupper($nombre);

  // Print Text On Image
  imagettftext($jpg_image, 75, 0, 50, 400, $white, $font_path, $text);



  // Send Image to Browser
  imagepng($jpg_image);

  // Clear Memory
  imagedestroy($jpg_image);

  ?>

Вашата помощ ще бъде високо оценена, по-късно ще си счупя главата, опитвайки се да запазя изображението, като щракна върху бутона за изпращане, тъй като не искам потребителите да запазят изображението, като щракнат с десния бутон върху него.

Благодаря приятели!


person i'llbdevsomeday    schedule 13.04.2013    source източник


Отговори (2)


Имате нужда от ширината на изображението и ширината на текста, за да свържете и двете.

// get image dimensions
list($img_width, $img_height,,) = getimagesize("fabian.jpg");

// find font-size for $txt_width = 80% of $img_width...
$font_size = 1; 
$txt_max_width = intval(0.8 * $img_width);    

do {        
    $font_size++;
    $p = imagettfbbox($font_size, 0, $font_path, $text);
    $txt_width = $p[2] - $p[0];
    // $txt_height=$p[1]-$p[7]; // just in case you need it
} while ($txt_width <= $txt_max_width);

// now center the text
$y = $img_height * 0.9; // baseline of text at 90% of $img_height
$x = ($img_width - $txt_width) / 2;

imagettftext($jpg_image, $font_size, 0, $x, $y, $white, $font_path, $text);
person michi    schedule 13.04.2013
comment
Страхотно мичи!!!, работи перфектно, благодаря ви много!!! Не можеш да си представиш колко пъти се опитах да го постигна, ти си гениален приятел, наистина го оценявам. Ще анализира и запомни всеки ред код и ще го има предвид за бъдещи справки. Благодаря! - person i'llbdevsomeday; 13.04.2013
comment
Това работи като чар за едноредов текст. Това няма да служи на целта за няколко реда текст. Благодаря - person JayKandari; 05.11.2015
comment
@JayKandari благодаря за комплимента, като забележка целта на OP беше да центрира името на човек върху неговата снимка, което е един ред ... поне с повечето имена :-) - person michi; 05.11.2015

Можете да използвате клас stil/gd-text, за да подравните текста. Отказ от отговорност: Аз съм авторът.

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

$jpg_image = imagecreatefromjpeg('fabian.jpg');

$textbox = new Box($jpg_image);
$textbox->setFontSize(75);
$textbox->setFontFace('fabian.TTF');
$textbox->setFontColor(new Color(255, 255, 255));
$textbox->setBox(
    50,  // distance from left edge
    50,  // distance from top edge
    200, // textbox width
    100  // textbox height
);

// text will be aligned inside textbox to center horizontally and to top vertically
$textbox->setTextAlign('center', 'top');
$textbox->draw(strtoupper($nombre));

Това обаче не е пълен отговор, защото не може автоматично да намали размера на шрифта.

person stil    schedule 02.01.2015