Tkinter сохраняет холст в неправильном масштабе - PullRequest
0 голосов
/ 28 ноября 2018

Я пишу программу рисования в tkinter, и одна из моих функций сохраняет окончательный вывод холста (мое изображение отображается на холсте с координатой 0,0).Я сохраняю холст в памяти как файл postscript и использую PIL для сохранения postscript на диск в формате PNG (PIL использует ghostscript при сохранении файла postscript).Однако холст всегда сохраняется на 60,15% от его первоначального размера.Я хотел бы сохранить изображение как 100% от его исходного размера, хотя я не могу понять, как это сделать в моем коде.

Вот мой код ниже:

 """my image is 256 x 256"""
ps = self.canvas_image.canvas.postscript(colormode='color',  x = 0, y = 0, 
            height = 256, width = 256)
im = Image.open(BytesIO(ps.encode('utf-8')))
im.save(filepath, "PNG")

А вот мои изображения (вверху - оригинальное изображение, внизу - сохраненное изображение):

Original image

enter image description here

1 Ответ

0 голосов
/ 28 ноября 2018

Оказывается, что postscript - это векторизованный формат изображения, и перед растеризацией изображение необходимо масштабировать.Ваша векторная шкала может отличаться от моей (моя была 0,60): вы можете просмотреть масштабный коэффициент в инкапсулированном файле postscript, если масштабные коэффициенты DPI в этом коде не работают для вас

Открытый код EPS былвзято из этого поста: как сохранить размер холста при преобразовании холста Python Turtle в растровое изображение

Я использовал этот фрагмент кода, чтобы решить мою проблему:

ps = self.canvas_image.canvas.postscript(colormode='color', x = 0, y = 0,  height = 256, width = 256)                                                 

""" canvas postscripts seem to be saved at 0.60 scale, so we need to increase the default dpi (72) by 60 percent """
im = open_eps(ps, dpi=119.5)
#im = Image.open('test.ps')
im.save(filepath, dpi=(119.5, 119.5))

def open_eps(ps, dpi=300.0):
    img = Image.open(BytesIO(ps.encode('utf-8')))
    original = [float(d) for d in img.size]
    scale = dpi/72.0            
    if dpi is not 0:
        img.load(scale = math.ceil(scale))
    if scale != 1:
        img.thumbnail([round(scale * d) for d in original], Image.ANTIALIAS)
    return img
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...