1

Je suis en train de créer une application similaire à Paint Comme je veux pouvoir repositionner et modifier les propriétés de forme plus tard, j'utilise Tkinter pour dessiner des formes sur Canvas au lieu de PIL Draw ou autre chose. D'autres réponses, j'ai trouvé comment enregistrer une toile au format PNG en créant un fichier postscript, puis en le convertissant au format PNG en utilisant PIL.Comment enregistrer un fichier .EPS au format PNG avec transparence en Python

Maintenant, le problème est le fichier EPS a des espaces transparents, mais le fichier PNG remplit ces vides avec une couleur de fond blanc. Je ne suis pas sûr d'où je vais mal.

Voici la fonction que j'ai utilisée.

def saveImg(event): 
    global canvas 
    canvas.postscript(file="my_drawing.eps", colormode='color') 
    imgNew = Image.open("my_drawing.eps") 
    imgNew.convert("RGBA") 
    imgNew.thumbnail((2000,2000), Image.ANTIALIAS) 
    imgNew.save('testImg.png', quality=90) 
+0

Avez-vous ghostscript installé dans votre système? BTW, quelle plate-forme exécutez-vous? –

+0

@PauloScardine Oui! J'ai ghostscript installé. Je cours python 3.5.2 sur Mac OS –

+0

Vous pourriez faire la conversion sur la ligne de commande avec GhostScript, comme ceci: 'gs -dSAFER -dNOPAUSE -dBATCH -r150 -sDEVICE = pngalpha -sOutputFile = testImg.png mon_drawing.eps '. Le '-r150' définit la résolution à 150 DPI, les résolutions plus élevées prennent plus de temps à rendre. –

Répondre

2

On dirait que la transparence n'est pas supportée. De the docs:

Le pilote EPS peut lire les images EPS en L, LAB, mode RVB et CMJN, mais Ghostscript peut convertir les images en mode RVB plutôt que de les laisser dans l'espace de couleur d'origine.

Lorsque vous chargez en RVB (au lieu de RVB A) les informations de canal alpha est mis au rebut et la convertir en RGBA ne se rétablira pas plus tard. La meilleure solution est de le porter sur des kits d'outils plus récents, tels que cairo ou QT, ou de convertir le fichier en utilisant GhostScript directement comme suggéré par PM2Ring.

Pour l'approche GS afin de définir la largeur et la hauteur du fichier de sortie, vous devez utiliser le commutateur -rNN est la résolution en PPI (pixels par pouce). Vous devez effectuer le calcul afin d'obtenir la résolution cible à partir de la boîte englobante EPS et de la taille de sortie souhaitée.

Ou vous pouvez rendre à une résolution fixe d'abord, disons, 100 PPI, voir la largeur que vous avez et faire le calcul afin d'obtenir la bonne résolution. Par exemple, si le rendu avec -r100 vous donne un fichier de 500 pixels de large, mais vous voulez qu'il soit 1024:

desired_resolution = initial_resolution * desired_width // initial_width 

Afin d'obtenir un fichier 1024 pixels de large:

>>> 100 * 1024 // 500 
204 

vous devez donc rendre l'EPS utilisant à nouveau -r204.

Edit 1:

je me suis la solution de ce Question Nous pouvons mettre en largeur et une hauteur à l'aide -gNNNNxMMMM mais les cultures de valeur dpi seulement une petite zone. J'ai essayé avec l'habituel 72dpi et j'ai eu une sortie décente (je ne suis pas sûr si c'est parfait ou non). Maintenant, je dois trouver comment exécuter cette commande chaque fois que je lance le programme et fournir la valeur de taille d'image personnalisée. : \

+0

J'ai essayé ceci mais il a résulté avec le même problème de taille. J'ai comparé le rapport W/H du png converti PIL et GS converti png et ce que j'ai trouvé était GS lit la largeur de l'image comme Hauteur et Hauteur comme Largeur: \ Im pas sûr pourquoi cela se produit, parce que même PIL utilise GS pour rendre png mais il n'y a pas de problème avec la largeur et la hauteur. (PIL.png) L/H = H/L (GS.png) –