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

Jak*_*ang 4 python-imaging-library python-3.x

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

我知道可以通过这样做来压缩图像:

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

但我想通过调整更多参数来更进一步,如下所示:

im.save(output_path, optimize=True, quality=50, jfif_unit=1, dpi=(72,72), jfif_density=(72,72))
Run Code Online (Sandbox Code Playgroud)

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

小智 6

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

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
Run Code Online (Sandbox Code Playgroud)

以上更改 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
Run Code Online (Sandbox Code Playgroud)

对于上述所有内容,您将需要两个导入:

from PIL import Image
import tempfile
Run Code Online (Sandbox Code Playgroud)

我知道如果您运行代码来批量检查许多图像(例如,我正在循环浏览数千张照片,对每张照片执行此操作),您不希望您的 App Data 临时文件夹充满临时文件。因此,我还有一个 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)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。

  • 为什么必须使用临时文件?我们不能简单地保存旧文件吗? (6认同)