一个愿意伫立在巨人肩膀上的农民......
一、缩放图像应用概述
1、节省时间:手动缩放每张图像不仅耗时,而且容易出错。使用Python脚本进行批量处理可以极大地节省时间,特别是在处理大量图像时。
2、自动化流程:通过编写脚本,可以自动完成图像的读取、缩放、保存等步骤,形成一个完整的处理流程,减少人为干预。
3、统一尺寸:批量缩放可以将不同大小的图像调整为统一的大小,这对于后续的图像处理、分析或展示至关重要。
4、保持比例:在缩放过程中,保持图像的宽高比可以避免图像变形,确保图像的质量和视觉效果。
5、适应不同设备:在移动设备、网页或其他平台上展示图像时,可能需要不同大小的图像版本。批量缩放可以生成适合不同设备和分辨率的图像。
6、优化存储和传输:通过缩小图像尺寸,可以节省存储空间并减少网络传输时间,这对于在线服务和应用尤为重要。
二、图像缩放的三种方式
三、代码
1、按照原图宽高比等比例缩放
##!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author : 码韵
#################################################
# 将图片等比例缩放,长边按照给定的尺寸,图片长宽比不变
#################################################
import os
from PIL import Image
def resize_image_proportionally(input_image_path, output_image_path, size):
original_image = Image.open(input_image_path)
max_size = (size, size)
original_image.thumbnail(max_size, Image.LANCZOS)
# Image.NEAREST: 最近邻插值(速度最快但质量最低)。
# Image.BILINEAR: 双线性插值(速度和质量中等)。
# Image.BICUBIC: 双三次插值(速度较慢但质量较高)。
# Image.LANCZOS: Lanczos插值(质量最高但速度最慢)。
original_image.thumbnail(max_size, Image.LANCZOS)
original_image.save(output_image_path)
def batch_resize_images_proportionally(input_folder, output_folder, size):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp', '.tiff', '.webp')):
input_path = os.path.join(input_folder, filename)
output_path = os.path.join(output_folder, filename)
try:
resize_image_proportionally(input_path, output_path, size)
print(f"处理 /{filename}/ 并成功保存")
except Exception as e:
print(f"Error resizing {filename}: {e}")
if __name__ == "__main__":
input_folder = 'images' # 修改为你的图片文件夹路径
output_folder = 'LongB_image' # 修改为你想要保存缩放后图片的文件夹路径
size = 1024
print(f"开始将图片按长边为{size}等比例缩放")
batch_resize_images_proportionally(input_folder, output_folder, size)
print("处理完毕")
结果如下:
2、强制缩放到固定分辨率
##!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author : 码韵
#################################################
# 将图片强制缩放,生成长宽比为1:1的图像,不保留原图的长宽比
#################################################
import os
from PIL import Image
def resize_images_in_folder(input_folder_path, output_folder_path, size):
if not os.path.exists(output_folder_path):
os.makedirs(output_folder_path)
for filename in os.listdir(input_folder_path):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp', '.tiff', '.webp')): # 添加你需要的图片格式
input_file_path = os.path.join(input_folder_path, filename)
output_file_path = os.path.join(output_folder_path, filename)
try:
with Image.open(input_file_path) as img:
img_resized = img.resize(size)
img_resized.save(output_file_path)
except IOError as e:
print(f"I/O error({e.errno}): {e.strerror} - {input_file_path}")
except ValueError as e:
print(f"Value error: {e} - {input_file_path}")
if __name__ == "__main__":
input_path = 'images' # 修改为你的图片文件夹路径
output_path = 'over_image' # 修改为你想要保存缩放后图片的文件夹路径
size = (1024, 1024)
print(f"开始将图片强制缩放为{size}尺寸")
resize_images_in_folder(input_path, output_path, size)
print("处理完毕")
结果如下:
3、等比例缩放到固定分辨率,并填充指定像素值(此处填充像素值为(144, 144, 144))
##!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author : 码韵
#################################################
# 将图片等比例缩放,并生成长宽比为1:1的图像,短边填充
#################################################
import os
from PIL import Image
def resize_and_pad_image(input_image_path, output_image_path, size=(512, 512), bg_color=(0, 0, 0)):
# 打开原始图片
original_image = Image.open(input_image_path)
max_size = (size[0], size[1])
original_image.thumbnail(max_size, Image.LANCZOS)
# Image.NEAREST: 最近邻插值(速度最快但质量最低)。
# Image.BILINEAR: 双线性插值(速度和质量中等)。
# Image.BICUBIC: 双三次插值(速度较慢但质量较高)。
# Image.LANCZOS: Lanczos插值(质量最高但速度最慢)。
# 获取缩放后的图片尺寸
resized_width, resized_height = original_image.size
# 计算填充区域
pad_width = (size[0] - resized_width) // 2
pad_height = (size[1] - resized_height) // 2
# 创建一个新的512x512大小的图片,并用背景色填充
new_image = Image.new('RGB', size, bg_color)
# 将缩放后的图片粘贴到新的图片上
new_image.paste(original_image, (pad_width, pad_height))
# 保存新的图片
new_image.save(output_image_path)
def batch_resize_and_pad_images(input_folder, output_folder, size, bg_color):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 遍历输入文件夹中的所有文件
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp', '.tiff', '.webp')):
input_path = os.path.join(input_folder, filename)
output_path = os.path.join(output_folder, filename)
try:
resize_and_pad_image(input_path, output_path, size, bg_color)
print(f"处理 /{filename}/ 并成功保存")
except Exception as e:
print(f"Error processing {filename}: {e}")
# 使用示例
input_folder = 'images' # 图片文件夹路径
output_folder = 'resize_image' # 保存缩放后图片的文件夹路径
size = (1024, 1024) # 缩放图像大小
bg_color=(144, 144, 144) # 短边填充部分像素值
print(f"开始将图片缩放为{size}大小的图像")
batch_resize_and_pad_images(input_folder, output_folder, size, bg_color)
print("处理完毕")
欢迎在这里评论、沟通、指正。
创作不易,引用请附原文链接。。。。。。