鱼C论坛

 找回密码
 立即注册
查看: 831|回复: 0

[技术交流] python 缩放并裁剪图片 制作图片缩略图

[复制链接]
发表于 2022-1-19 19:21:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
(~~刚来,话说帖子能用markdown编辑吗,没发现有。~~)

                               
登录/注册后可看大图



说明
现在有一文件夹中存在许多分辨率不同的图片或文件夹,需要裁剪至指定大小以便作为网页中的图片缩略图。

cut 函数,将图片裁剪为指定大小,统一分辨率,缩放后取图片中间部分,超出的部分直接裁剪掉。
还有一个函数 cut2,为等比缩放至x或y为定值。

用法
缩放裁剪后的x、y像素值在代码开始部分更改即可。
默认只使用 cut 函数,使用 cut2 函数时需在代码第18-20行更改。
注意:
1.缩放裁剪后会覆盖原文件,需要的话,请在缩放裁剪前备份图片。
2.没有做文件夹验证,请确认输入正确的文件夹路径,并确保文件夹中只有图片。
3.多次缩放可能会使图片变得模糊,尤其是文字边缘。


完整代码
  1. import cv2
  2. import os
  3. import numpy as np

  4. # cut 裁剪后的 xy
  5. target_x = 286
  6. target_y = 203

  7. def get_dir(dir):
  8.         """ 遍历文件夹下所有的文件名 """

  9.         list1 = os.listdir(dir)
  10.         for l in list1:
  11.                 l = f'{dir}/{l}'
  12.                 if(os.path.isdir(l)):
  13.                         get_dir(l)
  14.                 else:
  15.                         cut(l)
  16.                         # cut2(l,x=800)
  17.                         # cut2(l,y=400)

  18. def cut(inputdir = './t.jpg'):
  19.         """ 图片裁剪 """

  20.         # 裁剪后的文件名为
  21.         # outputdir = inputdir[:-4] + '_over.jpg'
  22.         # 设置为相同文件名,覆盖原文件
  23.         outputdir = inputdir

  24.         # img = cv2.imread(inputdir)        # imread读取不能包含中文文件名
  25.         img = cv2.imdecode(np.fromfile(inputdir, dtype=np.uint8), cv2.IMREAD_UNCHANGED)

  26.     # imdecode读取图像默BGR通道排列,
  27.     # img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)        # 转换为RGB

  28.         # img.shape:[height,width,channel]
  29.         in_y, in_x = img.shape[:2]
  30.         print(img.shape)

  31.         scale = target_x / target_y
  32.         scale1 = in_x / in_y

  33.         if(scale1 >= scale):
  34.                 size = (int(in_x/(in_y/target_y)), target_y)
  35.                 # print(1, size)
  36.         elif(scale1 < scale):
  37.                 size = (target_x, int(in_y/(in_x/target_x)))
  38.                 # print(2, size)
  39.         else:
  40.                 size = (target_x, target_y)
  41.                 print('error')

  42.         # 缩放到size=(x,y)
  43.         resized = cv2.resize(img, size, interpolation=cv2.INTER_AREA)

  44.         # 展示裁剪后的图片
  45.         # cv2.imshow('image', resized)
  46.         # cv2.waitKey(0)
  47.         # print('x', resized.shape[1], 'y', resized.shape[0])

  48.         if(resized.shape[1] == target_x):
  49.                 # x=target_x
  50.                 y0 = resized.shape[0] // 2 - target_y//2
  51.                 y1 = y0 + target_y
  52.                 x0 = 0
  53.                 x1 = target_x
  54.         if(resized.shape[0] == target_y):
  55.                 # y=target_y
  56.                 y0 = 0
  57.                 y1 = target_y
  58.                 x0 = resized.shape[1] // 2 - target_x//2
  59.                 x1 = x0 + target_x

  60.         output_img = resized[y0:y1, x0:x1]

  61.         # cv2.imwrite(outputdir, output_img)        # imwrite保存文件名不能包含中文
  62.         cv2.imencode('.jpg', output_img)[1].tofile(outputdir)

  63. def cut2(inputdir = './t.jpg', x=0, y=0):
  64.         """ 等比缩放,不裁剪 """
  65.         # outputdir = inputdir[:-4] + '_over.jpg'
  66.         outputdir = inputdir
  67.         img = cv2.imdecode(np.fromfile(inputdir, dtype=np.uint8), cv2.IMREAD_UNCHANGED)

  68.         in_y, in_x = img.shape[:2]
  69.         if(x):
  70.                 # 等比缩小为x=
  71.                 fxy = x/in_x
  72.         elif(y):
  73.                 # 等比缩小为y=
  74.                 fxy = y/in_y
  75.         else:
  76.                 fxy = 1

  77.         # 按比例缩放,fx:x轴缩放比例,fy:y轴缩放比例
  78.         output_img = cv2.resize(img, (0,0), fx=fxy, fy=fxy, interpolation=cv2.INTER_AREA)
  79.         cv2.imencode('.jpg', output_img)[1].tofile(outputdir)

  80. if __name__ == "__main__":
  81.         original_dir = input('文件夹路径:')
  82.         get_dir(original_dir)
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 14:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表