2017-10-17 19 views
0

MISE À JOUR Le problème de recadrage d'image SVG a été réduit à ImageMagick. Autrement dit, convert birthday_cake.svg birthday_cake.png génère un birthday_cake.png écrêté dans mon installation particulière, à savoir sur Ubuntu. J'étudie actuellement plus loin.Pourquoi ImageMagick recadre cette image SVG ... Rendu du glyphe U + 1F382

Ma version de convert est 6.7.7-10 et je vois la dernière version est actuellement à 7.0.7-8 afin que pourrait la question.

Original Question Follows

J'ai téléchargé un fichier SVG il chargé ensuite dans emacs, mais le troisième est en bas se recadrée. En outre, une petite quantité est recadrée du côté droit. Toutefois, le fichier est et non est recadré dans Firefox ni dans Google Chrome. En passant, ce SVG est un rendu du glyphe Unicode du gâteau d'anniversaire U + 1F382.

SVG image getting cropped when loaded into emacs

Je ne l'ai jamais remarqué cette culture pour tous les fichiers SVG ou image avant. Donc, je soupçonne qu'il y a une interaction étrange entre emacs et ce fichier SVG particulier.

Alors qu'est-ce que c'est à ce sujet particulier Fichier SVG qui déclenche le rognage dans emacs? De plus, comment puis-je demander à emacs d'afficher toute la hauteur et la largeur de ce fichier SVG?

$ wget -q http://www.fileformat.info/info/unicode/char/1f382/birthday_cake.svg 
$ emacs-snapshot -Q birthday_cake.svg --geometry 60x24 -eval '(set-frame-name "BAD SVG")' 
$ emacs-snapshot --version | head -1 
GNU Emacs 25.1.50.2 
$ firefox birthday_cake.svg 

SVG est inclus dans imagemagick-types:

(member 'SVG (imagemagick-types)) 
(SVG SVGZ TEXT TGA THUMBNAIL TIFF TIFF64 TILE TIM TTC TTF TXT ...) 

Voici une version abrégée du fichier SVG avec le chemin 12KB raccourci pour cette annonce:

<?xml version="1.0"?> 
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN' 'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'> 
<svg fill-opacity="1" xmlns:xlink="http://www.w3.org/1999/xlink" color-rendering="auto" 
    color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" 
    stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" 
    font-weight="normal" stroke-width="1" xmlns="http://www.w3.org/2000/svg" font-family="&apos;Dialog&apos;" 
    font-style="normal" stroke-linejoin="miter" font-size="12" stroke-dashoffset="0" image-rendering="auto"> 
    <!--Unicode Character 'BIRTHDAY CAKE' (U+1F382)--> 
    <defs id="genericDefs" /> 
    <g><g> 
    <path d="M285.1875 252 Q285.1875 274.5 ... 118.5469 221.3438 Z" stroke="none" /> 
    </g></g></svg> 

est l'un des les attributs dans l'étiquette SVG contribuant à ce recadrage d'image? Si oui, veuillez détailler ces éléments et expliquer l'interaction.

+0

Quel est le toolchain? emacs utilise ImageMagick, mais qu'utilise ImageMagick pour le rendu? Avez-vous installé librsvg? – ccprog

+0

Je n'ai pas librsvg installé pour le moment. Quant à votre question sur toolchain, j'ai décidé d'essayer 'convertir birthday_cake.svg birthday_cake.png'. Et 'birthday_cake.png' montre la même troncature. Donc, le problème est ImageMagick et ** pas ** emacs. Je vais enquêter sur ImageMagick plus loin, bien que je vérifie ici d'autres commentaires utiles –

+0

ImageMagick utilise Inkscape ou librsvg pour [rendre SVG] (http://www.imagemagick.org/script/formats.php) s'il les trouve dans le système . Si aucun n'est disponible, ImageMagick revient à son moteur de rendu SVG interne. – ccprog

Répondre

1

Vous obtenez l'image rendue via une chaîne d'outils en plusieurs parties. emacs utilise ImageMagick pour le rendu de l'image et ImageMagick utilise librsvg pour convertir l'image vectorielle en image tramée.

L'erreur que vous voyez a sa racine non dans le moteur de rendu, mais dans un fichier SVG défectueux. Il ne définit ni les attributs width ou height ni l'attribut viewBox. Aucune largeur et hauteur inhérentes à l'image ne peuvent donc être établies. librsvg essaie de résoudre ce problème en utilisant la boîte englobante combinée des éléments grafiques contenus pour trouver des valeurs de remplacement. Malheureusement, il le fait avec une erreur.

Pour trouver la zone de délimitation pour le contenu que vous pouvez le charger dans le navigateur et exécuter

document.querySelector('svg').getBBox() 

sur une console Javascript Le résultat est

{ 
    x: 11.531200408935547, 
    y: 68.4843978881836, 
    width: 273.65631103515625, 
    height: 272.8125 
} 

librsvg arrive au même résultat dans la mesure où l'image de sortie est 273px × 272px, mais le contenu n'est pas traduit de telle sorte que la bordure supérieure gauche de la boîte coïncide avec la bordure supérieure gauche de la fenêtre d'image, et qu'elle soit rognée du côté droit et inférieur.

Je ne sais pas comment la page Web source, www.fileformat.info, rend ce fichier SVG, mais vous pouvez dupliquer leur rendu avec un attribut viewBox

viewBox="-50 60 400 400" 
+0

Ceci est une bonne clarification ... et la brume est repoussée un peu plus loin. Il s'avère que j'ai eu librsvg installé, mais j'ai fait une lecture erronée de ma sortie de paquet-manager 'apt'. De plus, j'ai depuis installé Inkscape ainsi que l'outil de ligne de commande binaire au dessus de librsvg. En outre, j'ai appris comment obtenir inkscape pour corriger les fichiers SVG défectueux avec: 'inkscape --verb = FitCanvasToDrawing --verb = FileSave --verb = FileClose * .svg'. Le SVG résultant possède maintenant des attributs width et height dans la balise svg. –

+0

De cette façon, vous obtenez une récolte serrée sans "rembourrage". J'espère que c'est assez bon - eh bien, puisque plus d'informations sont manquantes, vous devrez reconstruire cela visuellement de toute façon. – ccprog