我尝试使用Inkscape从SVG创建PNG。我正在使用Linux。命令,
cat in.svg | inkscape -z /dev/stdin -w 800 -h 475 -e /dev/stderr 2> out.png
工作正常,但我不想在服务器上写输出文件。
我的代码是,
<?php
$svg_data = file_get_contents('in.svg');
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w") // stderr
);
$pipes = array();
$process = proc_open("inkscape -z /dev/stdin -w 800 -h 475 -e /dev/stderr", $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], $svg_data);
fclose($pipes[0]);
$fil_data = stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
file_put_contents("out.png", $fil_data);
}
?>
如果我改变了行,
$process = proc_open("inkscape -z /dev/stdin -w 800 -h 475 -e /dev/stderr", $descriptorspec, $pipes);
到
$process = proc_open("inkscape -z /dev/stdin -w 800 -h 475 -e out.png", $descriptorspec, $pipes);
正确的&#34; out.png&#34;打印出来。
当前代码写入文件,但文件已损坏。它似乎从头到尾都被破坏了,但它大小合适。
我想要$ fil_data中的数据(out.png),但我不想从磁盘驱动器中读取它。
为什么out.png已损坏,如何在不使用磁盘的情况下进行正确的转换。
答案 0 :(得分:0)
Inkscape在写入文件之前向stderr发送了一些消息。同样的事情发生在stdout上。通过跳过消息解决了这个问题。这一行,
$fil_data = stream_get_contents($pipes[2]);
更改为,
$fil_data = stream_get_contents($pipes[2], -1, 150);
如果有更好的方法,我希望看到它。