2012-03-12 45 views
2

我使用Etienne from here对Python的PIL进行了极好的修改。我所需要的正是修改所做的 - 使用与原始量化表相同的量化表来保存JPEG文件。通过这种修改来实现它看起来很优雅,我目前正在通过使用C代码大杂烩来实现这一点。在裁剪时保留PIL中的图像类型信息

我的问题是,我在PIL中得到一个JPEG文件对象,但是在任何修改之后,它就成为其他类型的对象。我想要的是拍摄图像,裁剪并用相同的量化表保存。

我尝试:

img = Image.open("someimage.jpg") 
width, height = img.size 
crop = img.crop((8, 0, width, height)) 
img = img.resize((width - 8, height)) 
img.paste(crop, (0,0)) 
img.save("crop.jpg", quality='keep') 

的IMG对象首先是一个PIL.JpegImagePlugin.JpegImageFile但调整大小/粘贴操作之后变成只是一个形象。所以我不能使用quality ='keep',因为它不再是JPEG。我已经尝试过裁剪和粘贴,我尝试了其他几种方法,但似乎没有保留JpegImageFile对象。

回答

2

如果使用this fork by Etienne,我认为你是,那么你应该能够做这样的事情:

img = Image.open("someimage.jpg") 
qt = img.quantization 
# qt is now a dictionary of arrays which is your quantization table. 

width, height = img.size 
crop = img.crop((8, 0, width, height)) 
img = img.resize((width - 8, height)) 
img.paste(crop, (0,0)) 

# pass qt in as you save your jpeg 
img.save("crop.jpg", qtables = qt) 

更多信息,请参见this documentation by Etienne

+0

啊,我愚蠢地想象不要在.py文件中检查文档。这只是一个小改动 - 必须为'qtables'参数提供'enumerate(qt)'而不仅仅是'qt'。 – DUman 2012-03-13 10:42:52

+0

如叉子的JpegPresets.py文件中所示,使用子采样和量化表创建整个预设也很有用。谢谢! – DUman 2012-03-13 10:57:23