1、用Python玩转图片处理

class ImageUtils: """ 图片处理工具 """ def __init__(self, source_dir, target_dir): self.source_dir = source_dir self.target_dir = target_dir def thumbnail(self, filename, percent=0.5): '缩略图' im = Image.open(os.path.join(self.source_dir, filename)) w, h = im.size print('Original image size: %sx%s' % (w, h)) im.thumbnail((int(w*percent), int(h*percent))) print('Thumbnail image to: %sx%s' % (int(w*percent), int(h*percent))) output = os.path.join(self.target_dir, filename.split('.')[0]+'-thumbnail.jpg') im.save(output, 'jpeg') def resize(self, filename, horizontal_ratio=0.5, vertical_ratio=0.5): '调整大小' im = Image.open(os.path.join(self.source_dir, filename)) w, h = im.size print('Original image size: %sx%s' % (w, h)) im_size = im.resize((int(w*horizontal_ratio), int(h*vertical_ratio))) print('Resize image to: %sx%s' % (int(w*horizontal_ratio), int(h*vertical_ratio))) output = os.path.join(self.target_dir, filename.split('.')[0]+'-resize.jpg') im_size.save(output, 'jpeg') def enhance(self, filename, enhance_ratio=1.3): '图片对比度增强' im = Image.open(os.path.join(self.source_dir, filename)) enh = ImageEnhance.Contrast(im) print(f'图像对比度增强: {enhance_ratio}倍') output = os.path.join(self.target_dir, filename.split('.')[0]+'-enhance.jpg') enh.enhance(enhance_ratio).save(output, 'jpeg') def region(self, filename, snap=(0.1, 0.1, 0.9, 0.9)): '截取一块区域' im = Image.open(os.path.join(self.source_dir, filename)) w, h = im.size box = (int(w*snap[0]), int(h*snap[1]), int(w*snap[2]), int(h*snap[3])) print(f'图像截取区域: {box}') region = im.crop(box) output = os.path.join(self.target_dir, filename.split('.')[0]+'-region.jpg') region.save(output, 'jpeg') def rotate(self, filename, angle=0): '旋转图片,翻转' im = Image.open(os.path.join(self.source_dir, filename)) print(f'图像旋转: {angle}°') output = os.path.join(self.target_dir, filename.split('.')[0]+'-rotate.jpg') im.rotate(angle).save(output, 'jpeg') def flip(self, filename, horizontal=False, vertical=False): '翻转' im = Image.open(os.path.join(self.source_dir, filename)) if horizontal: print('图像水平翻转') im = im.transpose(Image.FLIP_LEFT_RIGHT) if vertical: print('图像上下翻转') im = im.transpose(Image.FLIP_TOP_BOTTOM) output = os.path.join(self.target_dir, filename.split('.')[0]+'-flip.jpg') im.save(output, 'jpeg') def add_logo(self, filename, logo_file): '添加水印' im_logo = Image.open(os.path.join(self.source_dir, logo_file)) logo_width, logo_height = im_logo.size im_target = Image.open(os.path.join(self.source_dir, filename)) target_width, target_height = im_target.size im_copy = im_target.copy() print('图像添加水印') im_copy.paste(im_logo, (target_width-logo_width, target_height-logo_height), im_logo) output = os.path.join(self.target_dir, filename.split('.')[0]+'-add_logo.jpg') im_copy.save(output, 'jpeg') def new_image(self, text='Text'): '创建新图片' im_new = Image.new('RGBA', (400, 400), 'white') print('创建新图片') pic = ImageDraw.Draw(im_new) print('图片添加文字') pic.text((50, 50), text, fill='blue') output = os.path.join(self.target_dir, 'new_image.png') im_new.save(output) def msyh_font(self, text='文字'): '设置字体' im_new = Image.new('RGBA', (400, 400), 'white') pic = ImageDraw.Draw(im_new) fonts_path = r'D:\VSCode\xuan_demo_v0302\fonts\msyh.ttf' msyh = ImageFont.truetype(fonts_path, 40) print('文字格式为微软雅黑') pic.text((50, 50), text, fill='blue', font=msyh) output = os.path.join(self.target_dir, 'new_image_msyh.png') im_new.save(output)2、导出文件列表到Excel文件

class ImageSystem: """ 图片列表生成excel文件系统""" def __init__(self, dirname): self.dirpath = dirname def listfile(self, img_type='.jpg'): '获取指定路径下所有的图片文件, 返回列表' img_File_List = os.listdir(self.dirpath) # 图片列表 image_list = [] for filename in img_File_List: filepath = os.path.join(self.dirpath, filename) # 图片的绝对路径 if os.path.isdir(filepath): self.listfile(filepath) print(filepath) else: if os.path.isfile(filepath) and filename.lower().endswith(img_type): print(os.path.join(self.dirpath, filename)) image_list.append(os.path.join(self.dirpath, filename)) return image_list def xlsx_create(self, image_list, filename='Workbook.xlsx'): '创建excel表格' wb = Workbook() ws = wb.active ws['A1'] = '文件名:' for s in image_list: ws.append([s, self.get_FileSize(s)]) ws.append([datetime.datetime.now()]) output = os.path.join(r'D:\VSCode\xuan_demo_v0302\test', filename) print('创建excel表格') wb.save(output) def get_FileSize(self, filename): '获取文件的大小,结果保留两位小数,单位为kb' fsize = os.path.getsize(filename) fsize = fsize/float(1024) return f'{round(fsize, 2)} kb'3、运行

def main(): source_dir = r'D:\VSCode\xuan_demo_v0302\image' target_dir = r'D:\VSCode\xuan_demo_v0302\test' test_image = ImageUtils(source_dir, target_dir) test_image.thumbnail('scenery.jpg', 0.9) test_image.resize('scenery.jpg', 0.9, 0.5) test_image.enhance('scenery.jpg', 1.5) test_image.region('scenery.jpg', snap=(0.2, 0.2, 0.55, 0.5555)) test_image.rotate('scenery.jpg', angle=10) test_image.flip('scenery.jpg', horizontal=True, vertical=True) test_image.add_logo('scenery.jpg', 'logo.png') test_image.new_image() test_image.msyh_font() image_file = ImageSystem(source_dir) image_list = image_file.listfile() image_file.xlsx_create(image_list, 'image_list.xlsx')if __name__ == "__main__": main()