使用PIL保存图像时如何更改dpi或浓度

时间:2019-01-02 03:56:02

标签: python-3.x python-imaging-library

我正在尝试使用PIL(更具体地讲,枕头)压缩jpg文件

我知道可以通过以下方式压缩图像:

from PIL import Image
im = Image.open(img_path)
im = im.resize(new_size, Image.ANTIALIAS)
im.save(output_path, optimize=True, quality=50)

但是我想通过调整更多参数来走得更远,就像这样:

im.save(output_path, optimize=True, quality=50, jfif_unit=1, dpi=(72,72), jfif_density=(72,72))

不幸的是,它根本不会改变dpi或密度。我应该如何实现?

1 个答案:

答案 0 :(得分:5)

在一些地方的一些文章的帮助下,我提出了以下内容:

def set_image_dpi_resize(image):
    """
    Rescaling image to 300dpi while resizing
    :param image: An image
    :return: A rescaled image
    """
    length_x, width_y = image.size
    factor = min(1, float(1024.0 / length_x))
    size = int(factor * length_x), int(factor * width_y)
    image_resize = image.resize(size, Image.ANTIALIAS)
    temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='1.png')
    temp_filename = temp_file.name
    image_resize.save(temp_filename, dpi=(300, 300))
    return temp_filename

以上内容将dpi(更改为300)并调整图像尺寸。它将所有结果保存到临时图像。

尽管有时您可能不想更改大小,而只是dpi,所以可以使用以下内容:

def set_image_dpi(image):
    """
    Rescaling image to 300dpi without resizing
    :param image: An image
    :return: A rescaled image
    """
    image_resize = image
    temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.png')
    temp_filename = temp_file.name
    image_resize.save(temp_filename, dpi=(300, 300))
    return temp_filename

对于上述所有操作,您将需要两次导入:

from PIL import Image
import tempfile

我了解,如果您运行代码来批量检查许多图像(例如,我循环浏览数千张照片,对其中每张照片进行此操作),则您不希望您的App Data temp文件夹中充满临时照片。因此,我还有一个delete close方法(用于关闭文件)和delete方法(用于从临时文件中删除它)。请注意,只有将其关闭才能删除它:

def close_image(image):
    """
    Closes opened image
    :param image: An image
    :return: None
    """
    image.close()


def removing_file(path):
    """
    Removing file by path
    :param path: The path of a file
    :return: None
    """
    # Try/except library import
    try:
        import os  # Miscellaneous OS library
    except ImportError as ImportException:
        raise ImportError("Cannot import needed libraries. Please contact administrator and give the code FN0001")
    os.remove(path)

希望有帮助。