我试图使用 PIL 打开一个(Illustrator).eps 文件,进行一些更改并保存它。我想在打开、创建或解释对象之前将文档设置为 300 dpi,并将颜色模式设置为 cmyk。
首先,我用 PythonMagick 尝试了同样的方法,它的工作原理是这样的:
import PythonMagick
# That's NOT what I want
img72 = PythonMagick.Image()
img_file = 'epstest.eps'
img.read(img_file)
img_dens = img72.density()
print 'W: %d, H: %d' % (img.size().width(), img.size().height())
# W: 403, H: 2475 <-- See here
print 'Density Width: %r' % img_dens.width() # 72
print 'Density Height: %r' % img_dens.height() # 72
# THAT is what I want
img300 = PythonMagick.Image()
img_file = 'epstest.eps'
img300.density('300') # set density / resolution
img300.read(img_file) # opens with defined density
img_dens = img300.density()
print 'W: %d, H: %d' % (img.size().width(), img.size().height())
# W: 1679, H: 10312 <-- See here!
print 'Density Width: %r' % img_dens.width() # 300
print 'Density Height: %r' % img_dens.height() # 300
PythonMagick 的问题:转换颜色模式不起作用,所以我对 PIL 进行了同样的尝试,我更喜欢:
from PIL import Image
img = Image.open('epstest.eps')
我知道可以在保存时设置 dpi。
没用的东西:
img = Image() # TypeError: 'module' object is not callable
img = Image.new() # TypeError: new() takes at least 2 arguments (0 given)
# .new() would create a different object anyway..
img = Image.open('epstest.eps', dpi = 300)
img = Image.open('epstest.eps', dpi = (300, 300) )
# After opening an Image
img.load(dpi=(300,300))
关于输入:我的 .eps 文件 - 如果它用 72dpi 解释(似乎是 PIL 默认值),它以 403x2475 像素结束,300dpi 它应该是 1677x10311 像素。此外,.eps 文件不包含预览位图,也不包含任何位图数据。只有 2 种颜色(黑色和白色),纯矢量。制作大量颜色分离的 .eps 文件的目录会很有用。
关于输出:将是一个png。
解决方案:
非常感谢 Paulo - 这是他的解决方案,改动非常小:
from PIL import Image
from PIL import EpsImagePlugin
import math
filename = 'epstest.eps'
def open_eps(filename, dpi=300.0):
img = Image.open(filename)
original = [float(d) for d in img.size]
# scale = width / original[0] # calculated wrong height
scale = dpi/72.0 # this fixed it
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
img = open_eps(filename, dpi=300.0)
img.save('pil_test.png', dpi=(300.0, 300.0))