2012-12-28 2 views
0

J'essaye de convertir un SVG en PNG mais je suis troublé avec lui.Imagick rendant une image noire

Avec ce lien, vous pouvez télécharger un SVG et le fichier affichera le résultat: http://clound.com.br/labs/svg/export/imagick/index.php

Le SVG que je suis en train de télécharger est ceci: http://clound.com.br/labs/svg/export/images/cover.svg

Mon code sur la page de téléchargement est la suivante:

<?php 
if ($_FILES){ 
$target_path = 'output/'. basename($_FILES['uploadedfile']['name']); 
$mime = $_FILES['uploadedfile']['type']; 

if ($_FILES['uploadedfile']['error']){ 
    die('Error on upload.'); 
} 

if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)){ 
    echo '<embed style="border:solid 1px gray;" src="'.$target_path.'" type="image/svg+xml" pluginspage="http://www.adobe.com/svg/viewer/install/" /><br/>'; 


    $im = new Imagick(); 
    $svg = file_get_contents($target_path); 

    /*loop to color each state as needed, something like*/ 
    $dom = new DOMDocument(); 
    $dom->loadXML($svg); 

    removeFillRule($dom, 'g'); 
    removeFillRule($dom, 'mask'); 
    removeFillRule($dom, 'path'); 
    removeFillRule($dom, 'image'); 

    $svg = $dom->saveXML(); 
    echo $svg; 

    $im->readImageBlob($svg); 

    /*png settings*/ 
    $im->setImageFormat("png32"); 
    $im->writeImage('output/image.png');/*(or .jpg)*/ 
    $im->clear(); 
    $im->destroy(); 

    echo '<img src="output/image.png"/><br/>'; 
} 
else 
{ 
    echo "There was an error uploading the file, verify permission and try again!"; 
} 
} 




function remove_children(&$node) { 
while ($node->firstChild) { 
while ($node->firstChild->firstChild) { 
    remove_children($node->firstChild); 
} 
$node->removeChild($node->firstChild); 
} 
} 


function removeFillRule($dom, $element){ 
$path = $dom->getElementsByTagName($element); 
foreach ($path as $key=> $value) { 
    $path->item($key)->removeAttribute('fill-rule'); 
} 
} 

Ma version sur le serveur est la suivante:

ImageMagick 6.7.6-8 2012-05-02 Q16 http://www.imagemagick.org

+0

Et avez-vous une erreur ou autre chose? – j0k

+0

Non, vous pouvez essayer de télécharger les images que j'ai posté sur le lien ... Je pense que quelque chose ne va pas avec mon code source SVG ... Il a été généré par BonsaiJS mais si vous essayez de sauvegarder cette image http : //clound.com.br/labs/svg/export/images/cover.svg il ne montre rien ... –

+0

J'ai essayé votre code avec ce fichier svg http://www.w3schools.com/svg/ circle1.svg obtenir une erreur de la fonction removeChild() où l'utilisez-vous? – Mateusz

Répondre

0

Suppression de remplissage règle? Cela va casser certains svgs, juste en disant. Je suis curieux, est-ce une solution de contournement pour un bug dans imagemagick? Quoi qu'il en soit, on peut supposer que votre problème est que imagemagick ne supporte probablement pas la syntaxe rgba dans fill/stroke - ce qui rendrait le noir de remplissage par défaut.

+0

La règle de remplissage c'est parce que le SVG rendu par bonsaijs a une règle de remplissage par défaut qui faisait que imagick ne le rend pas correct ... Je vais essayer de convertir les couleurs comme vous l'avez dit et voir ce qui se passe, merci pour l'aide. –

+0

Vous pouvez convertir 'fill = rgba (29,35,12,0.4)' dans le tuple 'fill =" rgb (29,35,12) "', 'fill-opacity =" 0,4 "'. Dans votre fichier, vous avez de nombreux exemples où le composant alpha est 1 ou 0, ce qui le rend encore plus simple. –