使用pycasso打乱图像时如何将slice_size设置为矩形而非正方形
pycasso实现矩形切片的解决方案
pycasso 官方原生的 Canvas 类仅支持传入整数作为正方形切片的边长,要实现矩形切片可以通过以下两种方案实现:
方案1:修改pycasso源码(永久生效)
- 找到本地pycasso库的安装路径,打开
canvas.py核心文件 - 定位到
__init__方法中处理切片尺寸的逻辑,将原来固定取slice_size作为宽高的代码,修改为支持元组输入:# 原有逻辑 # self.slice_width = slice_size # self.slice_height = slice_size # 修改后逻辑 if isinstance(slice_size, (list, tuple)) and len(slice_size) == 2: self.slice_width, self.slice_height = slice_size else: # 兼容原有正方形切片逻辑 self.slice_width = self.slice_height = slice_size - 修改完成后直接传入矩形尺寸的元组调用即可,示例代码:
from pycasso import Canvas img = 'input.jpeg' # 传入(宽度, 高度)的元组实现矩形切片,示例为宽200px高150px的切片 slice_size = (200, 150) seed = 'seed' pycasso = Canvas(img, slice_size, seed) pycasso.export(mode='scramble', path='image_output.png')
- 找到本地pycasso库的安装路径,打开
方案2:运行时动态打补丁(无需修改源码,仅当前脚本生效)
如果你不想改动第三方库的原生代码,可以在脚本开头通过猴子补丁修改初始化逻辑,示例代码如下:from pycasso import Canvas # 保存原有的初始化方法 original_init = Canvas.__init__ def new_init(self, img_path, slice_size, seed=None): # 先调用原有初始化逻辑 original_init(self, img_path, slice_size, seed) # 覆盖切片宽高逻辑 if isinstance(slice_size, (list, tuple)) and len(slice_size) == 2: self.slice_width, self.slice_height = slice_size # 重新计算切片数量 self.slices_x = self.width // self.slice_width self.slices_y = self.height // self.slice_height # 替换原有初始化方法 Canvas.__init__ = new_init # 后续调用逻辑和修改源码后的用法一致 img = 'input.jpeg' slice_size = (200, 150) seed = 'seed' pycasso = Canvas(img, slice_size, seed) pycasso.export(mode='scramble', path='image_output.png')
注意:请确保你设置的矩形切片的宽度能被原图宽度整除,高度能被原图高度整除,否则边缘区域会被自动裁剪不会参与打乱运算。
内容的提问来源于stack exchange,提问作者joebbynis
相关产品推荐
相关产品推荐

