MergePic.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import os
  2. import PIL.Image as Image
  3. def resize_by_width(infile, image_size):
  4. """按照宽度进行所需比例缩放"""
  5. im = Image.open(infile)
  6. (x, y) = im.size
  7. lv = round(x / image_size, 2) + 0.01
  8. x_s = int(x // lv)
  9. y_s = int(y // lv)
  10. print("x_s", x_s, y_s)
  11. out = im.resize((x_s, y_s), Image.ANTIALIAS)
  12. return out
  13. def get_new_img_xy(infile, image_size):
  14. """返回一个图片的宽、高像素"""
  15. im = Image.open(infile)
  16. (x, y) = im.size
  17. lv = round(x / image_size, 2) + 0.01
  18. x_s = x // lv
  19. y_s = y // lv
  20. # print("x_s", x_s, y_s)
  21. # out = im.resize((x_s, y_s), Image.ANTIALIAS)
  22. return x_s, y_s
  23. # 定义图像拼接函数
  24. def image_compose(image_colnum, image_size, image_rownum, image_names, image_save_path, x_new, y_new):
  25. to_image = Image.new('RGB', (image_colnum * x_new, image_rownum * y_new)) # 创建一个新图
  26. # 循环遍历,把每张图片按顺序粘贴到对应位置上
  27. total_num = 0
  28. for y in range(1, image_rownum + 1):
  29. for x in range(1, image_colnum + 1):
  30. from_image = resize_by_width(image_names[image_colnum * (y - 1) + x - 1], image_size)
  31. # from_image = Image.open(image_names[image_colnum * (y - 1) + x - 1]).resize((image_size,image_size ), Image.ANTIALIAS)
  32. to_image.paste(from_image, ((x - 1) * x_new, (y - 1) * y_new))
  33. total_num += 1
  34. if total_num == len(image_names):
  35. break
  36. return to_image.save(image_save_path) # 保存新图
  37. def get_image_list_fullpath(dir_path):
  38. file_name_list = os.listdir(dir_path)
  39. image_fullpath_list = []
  40. for file_name_one in file_name_list:
  41. file_one_path = os.path.join(dir_path, file_name_one)
  42. if os.path.isfile(file_one_path):
  43. image_fullpath_list.append(file_one_path)
  44. else:
  45. img_path_list = get_image_list_fullpath(file_one_path)
  46. image_fullpath_list.extend(img_path_list)
  47. return image_fullpath_list
  48. def merge_images(image_dir_path,image_size,image_colnum):
  49. # 获取图片集地址下的所有图片名称
  50. image_fullpath_list = get_image_list_fullpath(image_dir_path)
  51. print("image_fullpath_list", len(image_fullpath_list), image_fullpath_list)
  52. image_save_path = r'{}.jpg'.format(image_dir_path) # 图片转换后的地址
  53. print(image_save_path);
  54. # image_rownum = 4 # 图片间隔,也就是合并成一张图后,一共有几行
  55. image_rownum_yu = len(image_fullpath_list) % image_colnum
  56. if image_rownum_yu == 0:
  57. image_rownum = len(image_fullpath_list) // image_colnum
  58. else:
  59. image_rownum = len(image_fullpath_list) // image_colnum + 1
  60. x_list = []
  61. y_list = []
  62. for img_file in image_fullpath_list:
  63. img_x, img_y = get_new_img_xy(img_file, image_size)
  64. x_list.append(img_x)
  65. y_list.append(img_y)
  66. print("x_list", sorted(x_list))
  67. print("y_list", sorted(y_list))
  68. x_new = int(x_list[len(x_list) // 5 * 4])
  69. y_new = int(y_list[len(y_list) // 5 * 4])
  70. print(" x_new, y_new", x_new, y_new)
  71. image_compose(image_colnum, image_size, image_rownum, image_fullpath_list, image_save_path, x_new, y_new) # 调用函数
  72. # for img_file in image_fullpath_list:
  73. # resize_by_width(img_file,image_size)
  74. if __name__ == '__main__':
  75. image_dir_path = r'E:\photo\test' # 图片集地址
  76. image_size = 500 # 每张小图片的大小
  77. image_colnum = 2 # 合并成一张图后,一行有几个小图
  78. merge_images(image_dir_path, image_size, image_colnum)