I was trying to use PIL to open an (Illustrator) .eps-file, do some changes and save it. I want to set the document to 300 dpi, and color mode to cmyk before opening, creating or interpreting the object.
First I tried the same with PythonMagick and it worked like this:
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
Problem with PythonMagick: Converting Color Modes is not working, so i tried the same with PIL, which I would prefer:
from PIL import Image
img = Image.open('epstest.eps')
I know that it is possible to set dpi while saving.
Stuff that didn't work:
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))
Regarding the input: My .eps file - if it is interpreted with 72dpi (seems to be PIL default) it ends up with 403x2475 px, with 300dpi it should be 1677x10311 px. Also, the .eps-file does not contain a preview-bitmap, nor any bitmap-data. Only 2 colors (black and white), plain vectors. It would be useful to make a catalogue of a huge amount of color-separated .eps-files.
Regarding the output: will be a png.
Solution:
Many thanks to Paulo - this is his solution with very small changes:
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))