使用Pillow打开PostScript图像时像素尺寸异常问题求助
解决Pillow打开PostScript图像时像素尺寸不一致的问题
问题根源
tkinter的Canvas导出PostScript文件时,默认没有明确指定画布的物理尺寸和分辨率。Pillow渲染PS文件时用的是默认72DPI,和在线工具的渲染逻辑(通常匹配画布实际像素尺寸)不统一,就导致了像素拉伸或压缩的问题。
两种可行解决方案
方案1:导出PS时指定尺寸,Pillow打开匹配分辨率
修改你的saveFile函数,给canvas.postscript加上页面尺寸参数,同时在Image.open时指定对应DPI:
from PIL import Image, EpsImagePlugin import tkinter as tk def saveFile(canvas:tk.Canvas): EpsImagePlugin.gs_windows_binary = r'C:\Program Files\gs\gs9.56.1\bin\gswin64c' file_name = "img" # 获取画布实际宽高 canvas_w = canvas.winfo_width() canvas_h = canvas.winfo_height() # 导出PS时明确页面尺寸,单位为PostScript的"点"(1英寸=72点) canvas.postscript( file=f"images/ps/{file_name}.ps", colormode='color', pagewidth=f"{canvas_w}p", pageheight=f"{canvas_h}p" ) # 打开PS时指定72DPI,和页面尺寸单位匹配 psimage = Image.open(f'images/ps/{file_name}.ps', dpi=(72, 72)) # 保存PNG时也指定DPI确保尺寸正确 psimage.save(f'images/png/{file_name}.png', "png", dpi=(72, 72)) psimage.close()
方案2:直接用Ghostscript命令行转换(更稳定)
跳过Pillow的PS解析层,直接调用Ghostscript命令行转PNG,能精准控制输出尺寸:
import subprocess import tkinter as tk def saveFile(canvas:tk.Canvas): gs_path = r'C:\Program Files\gs\gs9.56.1\bin\gswin64c' file_name = "img" canvas.postscript( file=f"images/ps/{file_name}.ps", colormode='color' ) # 获取画布实际像素尺寸 canvas_w = canvas.winfo_width() canvas_h = canvas.winfo_height() # 构造Ghostscript转换命令 cmd = [ gs_path, '-dSAFER', '-dBATCH', '-dNOPAUSE', '-sDEVICE=png16m', # 用24位彩色PNG设备 f'-dDEVICEWIDTHPOINTS={canvas_w}', f'-dDEVICEHEIGHTPOINTS={canvas_h}', '-dGraphicsAlphaBits=4', # 抗锯齿提升画质 f'-sOutputFile=images/png/{file_name}.png', f'images/ps/{file_name}.ps' ] subprocess.run(cmd, check=True)
注意事项
- 代码里的路径建议用
/或者原始字符串(r'路径'),避免Windows下的转义字符问题。 - 方案2直接调用Ghostscript,比Pillow的封装逻辑更可靠,能完美匹配你期望的像素排列效果。
内容的提问来源于stack exchange,提问作者geo
相关产品推荐
相关产品推荐

