解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩

解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩

脚本地址:

项目地址: Gazer

PixelWeaver.py

pixel_squeezer_cv2.py

前瞻

继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后,本文将介绍如何使用 OpenCV 对这些海报进行智能拼接和压缩。我们将开发两个实用的 Python 脚本:PixelWeaver.pypixel_squeezer_cv2.py,前者可以根据指定的行列数和目标尺寸,智能地裁剪、调整并拼接多张图片,实现近似无损的拼接效果;后者则可以将大型图片压缩到指定大小,同时尽可能地保持图片质量。这两个脚本也可以作为通用的图片拼接/压缩工具使用。

使用方法

  1. 克隆或下载项目代码。
  2. 安装依赖: 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"
  • 设置拼接的行和列 rowscols
  • 设置目标尺寸/分辨率(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=10 max_width=1600, 这里目标大小为 10MB 以下, 最大宽度为1600

可选参数

  • 质量参数可选 0 到 100(包含 0 和 100) quality = 100

    说明
    经过测试, 合成图大小为 115MB, jpg 格式, quality = 100 可以压缩到 5.28MB. 所以脚本里默认是 100 了.

PixelWeaver.py

代码结构

  1. process_image 处理单张图片,进行智能裁剪或调整 (OpenCV)
  2. extract_date 从文件名中提取日期,用于排序 (regex)
  3. process_all_images 处理目录下的所有图片,返回处理后的图片列表
  4. create_collage 拼接海报并输出

说明和测试结果

上一篇中提到了仍有可能碰到 418 错误导致不能成功保存图片, 故建议按照日志中的链接保存图片并规范命名(只要以日期形式如 2024_12_31 开头即可), 以保证这个脚本中的正则表达式能愉快工作.

关于设置目标尺寸 target_size, 可以观察爬取的图片的分辨率, 我测试之后使用的数据是 1080 × 1600. 过大的图片会根据中心位置裁剪, 过小的图片使用插值缩放.
在这里插入图片描述

输入图片数量不足以填满拼接网格的处理

当输入的图片数量无法填满 rows * cols 的拼接网格时,create_collage 函数会在空白位置填充黑色。为了避免程序出错, 修改后的代码会在计算 rowcol 超出预设范围时,自动停止放置图片, 不会尝试访问不存在的图片元素。

原始的 create_collage 函数的核心循环部分:

  for i in range(num_images):
      row = i // cols
      col = i % cols
      x = col * target_w
      y 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值