Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Imagick - line-height


Автор: abalich 16.10.2012, 23:27
Добрый вечер. Использую Imagick, для того что бы генерировать изображения на лету. ПО верх изображение пишу текст. Но столкнулся вот с такой проблемой. По умолчанию annotateImage делает line-height:130% (подбирал по принтскринам).

Т.е. если текст на две строки, то расстояние между строк 120-130%. Как можно настроить line-height ?

Вот такой у меня код!

Код

$svgText = 'Unknow text';
$svgColor = '#000000';
$svgFon = 'transparent';
$svgRotate = 0;
$svgWidth = 400;
$svgHeight = 40;
$svgAlign = 2;
$svgSize = 20;
$svgFont = 'arial';
 
if(isset($_GET['text']) && $_GET['text'] != ''){$svgText = htmlspecialchars_decode($_GET['text']);}
if(isset($_GET['color']) && $_GET['color'] != '' && preg_match("/[0-9A-Za-z]/",$_GET['color']))
{$svgColor = '#'.$_GET['color'];}
if(isset($_GET['fon']) && $_GET['fon'] != '' && preg_match("/[0-9A-Za-z]/",$_GET['fon']) && $_GET['fon'] != 'transparent')
{$svgFon = '#'.$_GET['fon'];}
if(isset($_GET['rotate']) && ($_GET['rotate'] == '90' || $_GET['rotate'] == '0' || $_GET['rotate'] == '270' || $_GET['rotate'] == '180'))
{$svgRotate = $_GET['rotate'];}
if(isset($_GET['w']) && $_GET['w'] != '' && preg_match("/[0-9]/",$_GET['w']) && $_GET['w'] <= 400)
{$svgWidth = $_GET['w'];}
if(isset($_GET['h']) && $_GET['h'] != '' && preg_match("/[0-9]/",$_GET['h']))
{$svgHeight = $_GET['h'];}
if(isset($_GET['align']) && ($_GET['align'] == '1' || $_GET['align'] == '2' || $_GET['align'] == '3'))
{$svgAlign = $_GET['align'];}
if(isset($_GET['fontsize']) && $_GET['fontsize'] != '' && preg_match("/[0-9]/",$_GET['fontsize']) && $_GET['fontsize'] >= 5)
{$svgSize = $_GET['fontsize'];}
if(isset($_GET['fontname']) && $_GET['fontname'] != '' && file_exists('/usr/share/fonts/truetype/dinkyprint/'.$_GET['fontname'].'.ttf'))
{$svgFont = $_GET['fontname'];}
 
 
$im = new Imagick();
$text = new ImagickDraw();
$text->setFont('/usr/share/fonts/truetype/dinkyprint/'.$svgFont.'.ttf');
$text->setFillColor($svgColor);
$text->setFontSize($svgSize);
if($svgAlign == '1'){$text->setGravity (Imagick::GRAVITY_NORTHWEST);} elseif($svgAlign == '3'){$text->setGravity (Imagick::GRAVITY_NORTHEAST);} else{$text->setGravity (Imagick::GRAVITY_NORTH);}
 
$im->newImage($svgWidth,$svgHeight, new ImagickPixel(  $svgFon ));
$xy = $im->queryFontMetrics($text, $svgText, true);
if($xy['textWidth'] > $svgWidth){$svgWidth = $xy['textWidth'];}
if($xy['textHeight'] > $svgHeight){$svgHeight = $xy['textHeight'];}
 
$im->setImageFormat('png');
 
$im->annotateImage($text, 0, 0, $svgRotate, $svgText);
header('Content-type: image/png');
echo $im;
$im->destroy();


Автор: abalich 18.10.2012, 20:34
Ну что??? ни кто не хочет помочь!!

Автор: abalich 8.11.2012, 20:55
Блин.. ну кто нибудь!

Автор: Fortop 9.11.2012, 00:04
в гугле совсем забанили?

http://www.imagemagick.org/Usage/text/#interline-spacing

Автор: IgorIV 10.11.2012, 08:47
У меня сейчас нет возможности пробовать. 
Либо костыль - http://stackoverflow.com/questions/3577870/how-to-wrap-text-in-imagemagick
Либо копать в сторону - http://www.php.net/manual/en/imagick.setoption.php

Автор: abalich 11.11.2012, 15:29
Fortop, ну как через convert делать понятно.  я как именно через класс в PHP ?

Автор: skyboy 11.11.2012, 19:04
я думаю, ::setOption('interline-spacing' может помочь

Автор: abalich 13.11.2012, 09:44
skyboy, не помогает ни как

Код

im = new Imagick();
$im->setOption('-interline-spacing', '-5');
$text = new ImagickDraw();
$text->setFont('/usr/share/fonts/truetype/dinkyprint/'.$svgFont.'.ttf');
$text->setFillColor($svgColor);
$text->setFontSize($svgSize);
if($svgAlign == '1'){$text->setGravity (Imagick::GRAVITY_NORTHWEST);} elseif($svgAlign == '3'){$text->setGravity (Imagick::GRAVITY_NORTHEAST);} else{$text->setGravity (Imagick::GRAVITY_NORTH);}



$im->newImage($svgWidth,$svgHeight, new ImagickPixel(  $svgFon ));


Автор: abalich 13.11.2012, 11:05
Может кто-нибудь подскажет как победить этот чертов interline-spacing

Автор: skyboy 13.11.2012, 16:41
Цитата(abalich @  13.11.2012,  08:44 Найти цитируемый пост)
setOption('-interline-spacing'

дефис впереди зачем? о_0

Автор: Fortop 13.11.2012, 16:54
Цитата(skyboy @  13.11.2012,  16:41 Найти цитируемый пост)
дефис впереди зачем? о_0 

ну вот такие сейчас программисты smile

Автор: Aliance 13.11.2012, 16:58
это ж минус  smile 

Автор: skyboy 13.11.2012, 18:24
та ладно, хорош стебаться, я все равно не уверен, что setOption — для установки произвольных параметров. просто информации совсем мало, мож, и сработает.

Автор: abalich 27.11.2012, 06:28
Fortop, я делал без дефиса. не сработало, погуглил - нашел где с дефисом. все равно не работает

Автор: skyboy 27.11.2012, 08:46
ну, тогда забей на imagik — используй консольную утилиту напрямую.
или спроси у авторов. и это я всерьез предлагаю, да.

Автор: IgorIV 12.3.2013, 23:48
Здрасти smile
Копался я тут с imagick, вспомнил про топик. Вот результат.
https://bugs.php.net/bug.php?id=60434
В доках опции нет.
По данному коду требуется строка

Код

$text -> setTextInterlineSpacing(- ($svgSize/2 ));


Значение отрицательное и относительное

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)