解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩
脚本地址:
前瞻
继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后,本文将介绍如何使用 OpenCV 对这些海报进行智能拼接和压缩。我们将开发两个实用的 Python 脚本:PixelWeaver.py 和 pixel_squeezer_cv2.py,前者可以根据指定的行列数和目标尺寸,智能地裁剪、调整并拼接多张图片,实现近似无损的拼接效果;后者则可以将大型图片压缩到指定大小,同时尽可能地保持图片质量。这两个脚本也可以作为通用的图片拼接/压缩工具使用。
使用方法
- 克隆或下载项目代码。
- 安装依赖:
pip install opencv-python numpy,或者克隆项目代码后pip install -r requirements.txt
PixelWeaver.py
- 指定
image_dirs,保存的图片文件夹路径, 支持填写多个文件夹。 - 指定
output_path保存路径, 一定要写文件名, 如r"E:\Gazer\DoubanGaze\data\poster\movie_2022.jpg"。 - 设置拼接的行和列
rows和cols。 - 设置目标尺寸/分辨率(px)
target_size。
可选参数
- 按照日期顺序排列:
filenames.sort(key=extract_date, reverse=True)改为filenames.sort(key=extract_date, reverse=False) - 指定正则表达式:
re.search(r"(\d{4}_\d{2}_\d{2})", filename) # 匹配2024_12_30, 不匹配的文件会按照文件名顺序排在后面
pixel_squeezer_cv2.py
- 指定
image_dirs,输入图片路径 - 指定
output_path保存路径, 一定要写文件名, 如r"E:\Gazer\DoubanGaze\data\poster\movie_2022_compressed.jpg" - 指定压缩到多大和最大宽度
target_size_mb=10max_width=1600, 这里目标大小为 10MB 以下, 最大宽度为1600
可选参数
-
质量参数可选 0 到 100(包含 0 和 100)
quality = 100说明
经过测试, 合成图大小为 115MB, jpg 格式,quality = 100可以压缩到 5.28MB. 所以脚本里默认是 100 了.
PixelWeaver.py
代码结构
process_image处理单张图片,进行智能裁剪或调整 (OpenCV)extract_date从文件名中提取日期,用于排序 (regex)process_all_images处理目录下的所有图片,返回处理后的图片列表create_collage拼接海报并输出
说明和测试结果
上一篇中提到了仍有可能碰到 418 错误导致不能成功保存图片, 故建议按照日志中的链接保存图片并规范命名(只要以日期形式如 2024_12_31 开头即可), 以保证这个脚本中的正则表达式能愉快工作.
关于设置目标尺寸 target_size, 可以观察爬取的图片的分辨率, 我测试之后使用的数据是 1080 × 1600. 过大的图片会根据中心位置裁剪, 过小的图片使用插值缩放.

输入图片数量不足以填满拼接网格的处理
当输入的图片数量无法填满 rows * cols 的拼接网格时,create_collage 函数会在空白位置填充黑色。为了避免程序出错, 修改后的代码会在计算 row 或 col 超出预设范围时,自动停止放置图片, 不会尝试访问不存在的图片元素。
原始的 create_collage 函数的核心循环部分:
for i in range(num_images):
row = i // cols
col = i % cols
x = col * target_w
y


866

被折叠的 条评论
为什么被折叠?



