2016-01-13 2 views
0

Итак, я создал функцию в своей программе, которая позволяет пользователю сохранять все, что он или она рисует на холсте Черепахи, как файл Postscript со своим именем. Тем не менее, были проблемы с некоторыми цветами, не появляющимися на выходе, в зависимости от характера файлов Postscript, а также файлы Postscript просто не будут открываться на некоторых других платформах. Поэтому я решил сохранить файл postscript в виде изображения JPEG, так как файл JPEG должен быть открыт на многих платформах, можно надеяться отобразить все цвета холста, и он должен иметь более высокое разрешение, чем файл postscript. Таким образом, чтобы сделать это, я попытался, используя PIL, следующий в моем сохранить функции:Как преобразовать файл постскриптума pton tkinter в файл изображения, читаемый PIL?

def savefirst(): 
    cnv = getscreen().getcanvas() 
    global hen 
    fev = cnv.postscript(file = 'InitialFile.ps', colormode = 'color') 
    hen = filedialog.asksaveasfilename(defaultextension = '.jpg') 
    im = Image.open(fev) 
    print(im) 
    im.save(hen + '.jpg') 

Однако всякий раз, когда я запускаю это, я получаю эту ошибку:

line 2391, in savefirst 
    im = Image.open(fev) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/Image.py", line 2263, in open 
    fp = io.BytesIO(fp.read()) 
AttributeError: 'str' object has no attribute 'read' 

Видимо это не может прочитайте файл postscript, так как это не, в соответствии с тем, что я знаю, изображение в нем, поэтому оно должно быть сначала преобразовано в изображение, затем прочитано как изображение, а затем, наконец, преобразовано и сохранено в виде файла JPEG. Вопрос в том, как я смогу сперва преобразовать файл postscript в файл изображения ВНУТРИ программа, возможно, используя библиотеку изображений Python? Оглядываясь вокруг, и Google не помог, так что любая помощь от пользователей SO очень ценится!

EDIT: После unubuntu's совет, я теперь это для моего спасения функции:

def savefirst(): 
    cnv = getscreen().getcanvas() 
    global hen 
    ps = cnv.postscript(colormode = 'color') 
    hen = filedialog.asksaveasfilename(defaultextension = '.jpg') 
    im = Image.open(io.BytesIO(ps.encode('utf-8'))) 
    im.save(hen + '.jpg') 

Однако, теперь, когда я бегу, я получаю эту ошибку:

line 2395, in savefirst 
    im.save(hen + '.jpg') 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/Image.py", line 1646, in save 
    self.load() 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/EpsImagePlugin.py", line 337, in load 
    self.im = Ghostscript(self.tile, self.size, self.fp, scale) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/EpsImagePlugin.py", line 143, in Ghostscript 
    stdout=subprocess.PIPE) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py", line 950, in __init__ 
    restore_signals, start_new_session) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py", line 1544, in _execute_child 
    raise child_exception_type(errno_num, err_msg) 
FileNotFoundError: [Errno 2] No such file or directory: 'gs' 

Что такое 'gs' и почему я получаю эту ошибку сейчас?

ответ

2

If you don't supply the file parameter в вызове cnv.postscript, то cnv.postscript возвращает PostScript в качестве (Unicode) строки. Затем вы можете преобразовать код юникода в байты и подать его на io.BytesIO и передать это Image.open. Image.open может принять в качестве первого аргумента любой файлоподобный объект, который реализует методы read, seek и tell.

import io 
def savefirst(): 
    cnv = getscreen().getcanvas() 
    global hen 
    ps = cnv.postscript(colormode = 'color') 
    hen = filedialog.asksaveasfilename(defaultextension = '.jpg') 
    im = Image.open(io.BytesIO(ps.encode('utf-8'))) 
    im.save(hen + '.jpg') 

Например, заимствуя из A. Rodas' code,

import Tkinter as tk 
import subprocess 
import os 
import io 
from PIL import Image 

class App(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.line_start = None 
     self.canvas = tk.Canvas(self, width=300, height=300, bg="white") 
     self.canvas.bind("<Button-1>", lambda e: self.draw(e.x, e.y)) 
     self.button = tk.Button(self, text="save", 
           command=self.save) 
     self.canvas.pack() 
     self.button.pack(pady=10) 

    def draw(self, x, y): 
     if self.line_start: 
      x_origin, y_origin = self.line_start 
      self.canvas.create_line(x_origin, y_origin, x, y) 
     self.line_start = x, y 

    def save(self): 
     ps = self.canvas.postscript(colormode='color') 
     img = Image.open(io.BytesIO(ps.encode('utf-8'))) 
     img.save('/tmp/test.jpg') 

app = App() 
app.mainloop() 
+0

Я попробовал первую часть, и я получаю ошибку 'FileNotFoundError: [Errno 2] Нет такого файла или каталога:«Gs «Это« Ghostscript »правильно? Если да, то как мне это получить? –

+0

Кроме того, мой os - это «Macintosh», и у меня есть «Python 3.5.1». Как мне получить Ghostscript в моей системе, потому что я не могу финансировать один из них. –

+0

Извините, у меня нет опыта установки ghostscript на Mac. – unutbu

Смежные вопросы