使用Python Wand能否不重复加载同一张图片就裁剪多个区域?
解决方案
不需要重复加载第一张图片,核心是不要直接在原始前景图对象上执行crop操作,避免破坏原始图像的完整数据。你可以每次裁剪前先克隆原始前景图的独立副本,在副本上完成裁剪、参数调整操作即可。
Wand中对应ImageMagick +repage 重置画布偏移的方法是reset_coords(),裁剪后调用即可清除裁剪产生的画布偏移参数,避免合成时位置出错。
优化后的代码实现如下:
from wand.image import Image bg_img = Image(filename='second_image.jpg') # 全局仅加载一次前景原图 fg_origin = Image(filename='first_image.jpg') # 裁剪叠加第一个区域 left = 50 top = 600 width = 30 height = 30 with fg_origin.clone() as fg_crop: fg_crop.crop(left, top, width=width, height=height) fg_crop.reset_coords() bg_img.composite(fg_crop, left, top) # 裁剪叠加第二个区域 left = 500 top = 600 width = 100 height = 30 with fg_origin.clone() as fg_crop: fg_crop.crop(left, top, width=width, height=height) fg_crop.reset_coords() bg_img.composite(fg_crop, left, top) bg_img.save(filename='second_image_plus_overlays.png') # 手动释放资源(如果不使用上下文管理器包裹Image对象的话建议加上) bg_img.close() fg_origin.close()
额外说明:这种方式仅执行一次磁盘IO读取前景原图,后续所有裁剪操作都在内存中完成,相比重复加载原图的实现效率高很多,内存占用也更低。使用with上下文管理器管理临时裁剪的小图对象,可以自动回收临时资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Carly314
相关产品推荐
相关产品推荐

