J'essaye de créer un PNG à partir d'un SVG en utilisant Inkscape. J'utilise Linux. la commande,Comment lire les binaires de pipe en PHP
cat in.svg | inkscape -z /dev/stdin -w 800 -h 475 -e /dev/stderr 2> out.png
fonctionne très bien, mais je préfère ne pas écrire les fichiers de sortie sur le serveur.
Mon code est
<?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);
}
?>
Si je change la ligne,
$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);
Le correct "out.png" est imprimé.
Le code actuel écrit un fichier, mais le fichier est endommagé. Il semble qu'il soit corrompu du début à la fin, mais il s'agit de la bonne taille.
Je veux les données (out.png) dans $ fil_data, mais je ne veux pas le lire à partir du lecteur de disque.
Pourquoi est-ce que out.png est corrompu et comment puis-je effectuer la conversion correcte sans recourir à l'écriture du disque.