ImageMagick долго конвертирует SVG с текстом в JPEG

Мы используем ImageMagick (версия: ImageMagick 6.9.1-7 Q16 x86_64) и его PHP-расширение Imagick в нашем стеке LAMP для преобразования SVG в JPEG, и это занимает ненормально много времени, когда SVG содержит любой текст (12-13 секунд/файл).

Когда то же самое запускается как отдельный PHP-скрипт из командной строки (или напрямую с помощью конвертации IM), он быстро конвертируется менее чем за 1 секунду, независимо от того, есть ли в нем текст или нет.

Стоит также отметить, что у нас нет этой проблемы с GraphicsMagick. (Но у него есть некоторые ошибки SVG, которые не устранены и не позволяют нам его использовать.)

Кто-нибудь знает, почему шрифты так долго обрабатываются в стеке LAMP или как определить основную причину замедления?

Образец SVG:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg"     xmlns:xlink="http://www.w3.org/1999/xlink" width="344" height="243"  viewBox="0 0 737 521">
<g class="main">
    <title>Main</title>
    <image xmlns:xlink="http://www.w3.org/1999/xlink" id="svg_12"  height="218.4417" width="291.2556" y="32.2537" x="-10.893" xlink:href="/tmp/767756670842438737_7032fbfb3c364e6da226254687eb1edb.jpg" style="pointer-events:inherit">29.75235 32.253654 209.964875 218.441697</image>
    <g font-size="normal" font-family="Allerta" class="textarea" id="svg_13" style="pointer-events:inherit">
        <rect opacity="0" fill-opacity="0" stroke-opacity="0" stroke-width="2" fill="#000" id="svg_10" height="32" width="150.4384" y="293.06824" x="550.14683" style="pointer-events:inherit"/>
        <text text-anchor="start" xml:space="preserve" fill="#000" font-size="21" y="293" x="550" id="svg_68" style="pointer-events:inherit">
            <tspan dy="14" x="550" xml:space="preserve" id="svg_69" style="pointer-events:inherit">
        hello </tspan>
            <tspan dy="21" x="550" xml:space="preserve" id="svg_70" style="pointer-events:inherit">gc </tspan>
        </text>
    </g>
</g>
</svg>

и код для преобразования:

$im = new Imagick(); 
$svg = file_get_contents($svgFile); 
$svg = str_replace(array("\n", "\r", "\t"), '', $svg); 
$im->readImageBlob($svg); 
$im->setImageFormat("jpeg"); 
$im->writeImage($jpgFile); 
$im->clear(); 

person Sayan Bhattacharyya    schedule 17.07.2015    source источник
comment
Какая у вас операционная система и знаете ли вы, использует ли IM собственную программу чтения svg или используется rsvg?   -  person dlemstra    schedule 17.07.2015
comment
Привет. Мы используем Ubuntu (12), и он использует делегат RSVG.   -  person Sayan Bhattacharyya    schedule 17.07.2015
comment
Я предполагаю, что PHP накладывает ограничение на память, отсутствующее в командной строке - попробуйте запустить identify -list resource как в командной строке, так и из PHP, используя system() или что-то подобное.   -  person Mark Setchell    schedule 17.07.2015
comment
Или попробуйте создать серию изображений, которые вы заполняете шумом, чтобы их нельзя было сжать до размеров 1000x1000, 2000x1000, 4000x1000 и т. д., и посмотрите, как время для этого меняется в PHP и вне его.   -  person Mark Setchell    schedule 17.07.2015


Ответы (1)


Этот SVG отлично конвертируется для меня.

Чтобы исследовать это, нужно запустить PHP-скрипт через strace с помощью такой команды:

strace -f -F /usr/local/bin/php testScript.php

Но с соответствующим путем для PHP в вашей системе.

Существует высокая вероятность того, что есть какое-то состояние ошибки, из-за которого «что-то» занимает гораздо больше времени, чем должно. Приведенная выше команда strace позволит вам увидеть все системные вызовы, которые выполняются, и сколько времени занимает каждый из них.

Я подозреваю, что вы увидите, что какой-то системный вызов занимает почти все время обработки, прежде чем вернуть код ошибки. Если вы не можете понять, что означает его вывод, пожалуйста, прикрепите вывод к своему вопросу или pastebin, и я попытаюсь расшифровать руны.

Предупреждение. strace может собирать информацию, которую вы не хотите раскрывать (например, секретные ключи), поэтому следует соблюдать осторожность, прежде чем публиковать ее где-либо.

person Danack    schedule 19.07.2015