【问题标题】:Preserving image type info in PIL when cropping裁剪时在 PIL 中保留图像类型信息
【发布时间】:2012-03-13 06:30:15
【问题描述】:

我正在使用 Etienne from here 对 Python 的 PIL 的出色修改。我需要的正是修改所做的 - 使用与原始相同的量化表保存 JPEG 文件。通过这种修改来实现它似乎很优雅,我目前正在通过使用 C 代码的大杂烩来实现。

我的问题是我在 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,但在调整大小/粘贴操作后变成了一个 Image。因此,我不能使用 quality='keep' 因为它不再是 JPEG。我已经尝试过如上所述的裁剪和粘贴,我尝试了其他一些方法,但似乎没有任何东西可以保留 JpegImageFile 对象。

【问题讨论】:

    标签: python image jpeg python-imaging-library


    【解决方案1】:

    如果您使用的是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 了解更多信息。

    【讨论】:

    • 啊,我愚蠢地没想到要在 .py 文件中检查文档。只需稍作更改即可使用 - 必须为 qtables 参数提供 enumerate(qt) 而不仅仅是 qt。
    • 使用二次采样和量化表创建整个预设也很有用,如 fork 的 JpegPresets.py 文件中所示。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-09-21
    • 2019-10-31
    • 2021-02-02
    • 2012-10-01
    • 2016-08-26
    • 2012-04-16
    • 2011-04-19
    • 2010-10-24
    相关资源
    最近更新 更多