我正在尝试使用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或密度。我应该如何实现?
答案 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)
希望有帮助。