Miraage
Angular/Laravel
- Регистрация
- 3 Июн 2008
- Сообщения
- 231
- Реакции
- 51
- Автор темы
- #1
Т.к. видел посты "как это сделать?!" ловите кому надо.
Исходник: книга PHP5
imagettf.php
Исходник: книга PHP5
PHP:
<?php ## Пример работы с TTF-шрифтом.
require_once "lib/imagettf.php";
// Выводимая строка.
// ВНИМАНИЕ! Для отображения русских букв необходимо их
// передавать не в кодировке Windows, а в Unicode!
$string = toUnicodeEntities($myText);
// Шрифт должен лежать в папке со скриптом
$font = getcwd()."/times.ttf";
// Загружаем фоновой рисунок.
$im = imageCreateFromPng($BackgroundImage);
// Угол поворота зависит от текущего времени.
$angle = (microtime(true)*10)%360;
// Ксли хотите, чтобы текст шел из угла в угол, раскомментируйте строчку:
# $angle = rad2deg(atan2(imageSY($im), imageSX($im)));
// Подгоняем размер текста под размер изображения.
$size = imageTtfGetMaxSize(
$angle, $font, $string,
imageSX($im), imageSY($im)
);
// Создаем в палитре новые цвета
$shadow = imageColorAllocate($im, 0, 0, 0);
$color = imageColorAllocate($im, 128, 255, 0);
// Вычисляем координаты вывода, чтобы текст оказался в центре.
$sz = imageTtfSize($size, $angle, $font, $string);
$x = (imageSX($im) - $sz[0]) / 2 + $sz[2];
$y = (imageSY($im) - $sz[1]) / 2 + $sz[3];
// Рисуем строку текста, вначале черным со сдвигом, а затем -
// основным цветом поверх (чтобы создать эффект тени).
imageTtfText($im, $size, $angle, $x+3, $y+2, $shadow, $font, $string);
imageTtfText($im, $size, $angle, $x, $y, $color, $font, $string);
// Сообщаем о том, что далее следует рисунок PNG.
Header("Content-type: image/png");
// Выводим рисунок
imagePng($im);
?>
PHP:
<?php ## Библиотека полезных функций для работы с TTF.
// Исправленная функция imageTtfBBox(). Работает корректно
// даже при ненулевом угле поворота $angle (исходная функция
// при этом работает неверно).
function imageTtfBBox_fixed($size, $angle, $fontfile, $text) {
// Вычисляем размер при НУЛЕВОМ угле поворота.
$horiz = imageTtfBBox($size, 0, $fontfile, $text);
// Вычисляим синус и косинус угла поворота.
$cos = cos(deg2rad($angle));
$sin = sin(deg2rad($angle));
$box = array();
// Выполняем поворот каждой координаты.
for ($i=0; $i<7; $i+=2) {
list ($x, $y) = array($horiz[$i], $horiz[$i+1]);
$box[$i] = round($x * $cos + $y * $sin);
$box[$i+1] = round($y * $cos - $x * $sin);
}
return $box;
}
// Вычисляет размеры прямоугольника с горизонтальными и вертикальными
// сторонами, в который вписан указанный текст. Результирующий массив
// имеет структуру:
// array(
// 0 => ширина прямоугольника,
// 1 => высота прямоугольника,
// 2 => смещение начальной точки по X относительно левого верхнего
// угла прямоугольника,
// 3 => смещение начальной точки по Y
// )
function imageTtfSize($size, $angle, $fontfile, $text) {
// Вычисляем охкатывающий многоугольник.
$box = imageTtfBBox_fixed($size, $angle, $fontfile, $text);
$x = array($box[0], $box[2], $box[4], $box[6]);
$y = array($box[1], $box[3], $box[5], $box[7]);
// Вычисляем ширину, высоту и смещение начальной точки.
$width = max($x)-min($x);
$height = max($y)-min($y);
return array($width, $height, 0-min($x), 0-min($y));
}
// Функция возвращает наибольший размер шрифта, учитывая, что
// текст $text обязательно должен поместиться в прямоугольник
// размерами ($width, $height).
function imageTtfGetMaxSize($angle, $fontfile, $text, $width, $height) {
$min = 1;
$max = $height;
while (true) {
// Рабочий размер - среднее между максимумом и минимумом.
$size = round(($max + $min) / 2);
$sz = imageTtfSize($size, $angle, $fontfile, $text);
if ($sz[0] > $width || $sz[1] > $height) {
// Будем уменьшать максимальную ширину до те пор, пока текст не
// "перехлестнет" многоугольник.
$max = $size;
} else {
// Наоборот, будем увеличивать минимальную, пока текст помещается.
$min = $size;
}
// Минимум и максимум сошлись друг к другу.
if (abs($max-$min) < 2) break;
}
return $min;
}
// Функция преобразует текст из кодировки iso8859-5 в Unicode-entities.
// Ее необходимо вызывать перед запуском imageTtfText(), чтобы корректно
// отображать русские буквы. Аргумент $from задает исходную кодировку
// страницы (см. convert_cyr_string() для описания значений параметра).
function toUnicodeEntities($text, $from="w") {
$text = convert_cyr_string($text, $from, "i");
$uni = "";
for ($i=0, $len=strlen($text); $i<$len; $i++) {
$char = $text{$i};
$code = ord($char);
$uni .= ($code>175)? "&#" . (1040+($code-176)) . ";" : $char;
}
return $uni;
}
?>