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)
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
9080 次 |
| 最近记录: |