2010-08-30 4 views
3

Je suis nouveau sur Python alors s'il vous plaît soyez patient avec moi.
Fondamentalement, mon script devrait fonctionner comme ceci:Lire le fichier SVG avec Python/PIL

1) Chargez une image et le diviser en R, G, canaux B
2) Marquer une zone de cette image avec un chemin existant enregistré en tant que fichier svg et
3) effectuer quelques calculs avec les valeurs R, G, B de cette zone.
(en outre envoyer l'image soit vers le dossier A ou B, en fonction du résultat de la calc)

J'ai fait 1) et des parties de 3) mais mon problème actuel est de charger le fichier svg et d'appliquer sur mon image.
L'image est une photographie prise avec un objectif fisheye. Je veux juste obtenir les valeurs RVB de la photo réelle - pas le fond noir. J'ai créé le fichier svg en dessinant le chemin désiré avec GIMP (pas un cercle).

Ma question est:
Comment charger un fichier svg existant (et le lire comme un chemin) avec python et appliquer le chemin sur une image?

Je suis sûr qu'il existe un moyen simple de le faire, mais je ne l'ai pas encore trouvé.

Des conseils et des recommandations seront appréciés!


Edit:

Le fichier svg:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" 
      `"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 

<svg xmlns="http://www.w3.org/2000/svg" 
    width="22.2222in" height="16.6667in" 
    viewBox="0 0 1600 1200"> 
    <path id="Auswahl" 
     fill="none" stroke="black" stroke-width="1" 
     d="M 848.00,103.21 
      C 848.00,103.21 861.00,103.96 861.00,103.96 
      891.77,105.30 921.91,109.93 952.00,116.58 
      988.30,124.59 1023.25,137.24 1057.00,152.69 
      1210.78,223.11 1322.55,368.09 1353.61,534.00 
      1358.02,557.54 1361.00,581.11 1362.04,605.00 
      1362.04,605.00 1363.00,616.00 1363.00,616.00 
      1363.00,616.00 1363.00,649.00 1363.00,649.00 
      1363.00,649.00 1362.04,662.00 1362.04,662.00 
      1360.12,705.99 1352.05,749.92 1338.98,792.00 
      1289.63,950.77 1167.62,1077.58 1011.00,1133.31 
      962.90,1150.42 911.98,1160.82 861.00,1163.04 
      861.00,1163.04 848.00,1164.00 848.00,1164.00 
      848.00,1164.00 815.00,1164.00 815.00,1164.00 
      815.00,1164.00 804.00,1163.04 804.00,1163.04 
      756.47,1160.97 709.15,1151.72 664.00,1136.67 
      608.47,1118.16 556.55,1090.63 510.00,1055.12 
      469.68,1024.36 434.97,988.81 404.88,948.00 
      288.05,789.50 269.64,577.90 355.26,401.00 
      418.58,270.18 535.32,170.13 674.00,127.02 
      700.27,118.86 729.73,111.96 757.00,108.28 
      757.00,108.28 795.00,104.17 795.00,104.17 
      795.00,104.17 809.00,103.21 809.00,103.21 
      809.00,103.21 848.00,103.21 848.00,103.21 Z" /> 
</svg> 

Et le lien vers l'image: http://img153.imageshack.us/img153/5330/skybig.jpg

+0

Si vous pourrait partager un exemple d'image et un fichier svg, il serait plus facile de comprendre ce que vous avez l'intention de faire. Quel genre de calcul faites-vous dans la 3ème étape? – Offe

+0

Une petite mise à jour: je n'ai pas trouvé un moyen de le faire avec PIL mais avec GIMP – seb

+0

@seb Si vous avez trouvé un moyen d'utiliser GIMP alors soyez-le. Vous pouvez vous interfacer avec GIMP en utilisant Python, donc le problème est résolu (pourquoi insisteriez-vous sur l'utilisation d'un outil qui ne résout pas votre problème?). – mmgp

Répondre

3

Vous devez pixelliser le fichier SVG à un bitmap et vous peut superposer à l'image originale en utilisant PIL, car il ne supporte pas les images vectorielles. J'ai fait des recherches il y a quelques temps, et la seule bibliothèque que j'ai trouvé qui supporte cela sous python est cairo (encore une fois, peut-être que le paysage des outils de rastérisation SVG a changé ces derniers mois).

L'inverse (je ne pense pas que cela répond à vos besoins) est d'appliquer votre image bitmap d'origine en arrière-plan pour le SVG un, mais cela semble tellement effrayant ... ;-)

+0

comment appliqueriez-vous l'image originale comme bitmap au svg? – agconti