如何将Python tkinter canvas postscript文件转换为PIL可读的图像文件? [英] How to convert a Python tkinter canvas postscript file to an image file readable by the PIL?

查看:471
本文介绍了如何将Python tkinter canvas postscript文件转换为PIL可读的图像文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,我在程序中创建了一个函数,该函数使用户可以将自己在Turtle画布上绘制的任何内容保存为具有自己名字的Postscript文件.但是,根据Postscript文件的性质,存在一些颜色未出现在输出中的问题,并且Postscript文件只是在某些其他平台上无法打开.因此,我决定将后记文件另存为JPEG图像,因为JPEG文件应该可以在许多平台上打开,可以显示画布的所有颜色,并且分辨率应比后记文件高.因此,为此,我尝试在保存功能中使用PIL进行以下操作:

So I have created a function in my program that allows the user to save whatever he/she draws on the Turtle canvas as a Postscript file with his/her own name. However, there have been issues with some colors not appearing in the output as per the nature of Postscript files, and also, Postscript files just won't open on some other platforms. So I have decided to save the postscript file as a JPEG image since the JPEG file should be able to be opened on many platforms, can hopefully display all the colors of the canvas, and it should have a higher resolution than the postscript file. So, to do that, I have tried, using the PIL, the following in my save function:

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')

但是,每当我运行此命令时,都会出现此错误:

However, whenever I run this, I get this error:

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'

显然,它不能读取后记文件,因为它不是,据我所知,它本身就是图像,因此必须先将其转换为图像,然后再读取为图像,然后然后最终转换并保存为JPEG文件. 问题是,我如何首先可能将Python图像库中的Postscript文件转换为图像文件?环顾SO和Google毫无帮助,因此非常感谢SO用户提供的任何帮助!

Apparently it cannot read the postscript file since it's not, according to what I know, an image in itself, so it has to first be converted into an image, THEN read as an image, and then finally converted and saved as a JPEG file. The question is, how would I be able to first convert the postscript file to an image file INSIDE the program possibly using the Python Imaging Library? Looking around SO and Google has been no help, so any help from the SO users is greatly appreciated!

编辑:按照unubuntu's的建议,我现在将其用于保存功能:

Following unubuntu's advice, I have now have this for my save function:

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')

但是,现在每当我运行它时,都会出现此错误:

However, now whenever I run that, I get this error:

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'?为什么现在出现此错误?

What is 'gs' and why am I getting this error now?

推荐答案

Image.open 可以接受第一个参数是实现readseektell方法的类似文件的对象.

If you don't supply the file parameter in the call to cnv.postscript, then a cnv.postscript returns the PostScript as a (unicode) string. You can then convert the unicode to bytes and feed that to io.BytesIO and feed that to Image.open. Image.open can accept as its first argument any file-like object that implements read, seek and tell methods.

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的代码

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()

这篇关于如何将Python tkinter canvas postscript文件转换为PIL可读的图像文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆