def read(file, flags=None, **kwargs): if xlpil.is_pil_image(file): im = file elif xlcv.is_cv2_image(file): im = xlcv.to_pil_image(file) elif File.safe_init(file): im = PIL.Image.open(str(file), **kwargs) else: raise TypeError(f'类型错误或文件不存在:{type(file)} {file}') return xlpil.cvt_channel(im, flags)
def to_bcompare_files(cls, *args, files=None): """ 这个需要一次性获得所有的数据,才适合分析整体上要怎么获取对应的多个文件 :param files: 每个arg对应的文件名,默认按 'left'、'right', 'base' 来生成 也可以输入一个list[str],表示多个args依次对应的文件名 filename的长度可以跟args不一致,多的不用,少的自动生成 """ # 1 如果oldfile和newfile都是dict、set、list、tuple,则使用特殊方法文本化 # 如果两个都是list,不应该提取key后比较,所以限制第1个类型必须是dict或set,然后第二个类型可以适当放宽条件 # if not oldfile: oldfile = str(oldfile) if len(args) > 1 and isinstance(args[0], (dict, set)) and isinstance( args[1], (dict, set, list, tuple)): args = copy.copy(list(args)) t = [ prettifystr(li) for li in intersection_split(args[0], args[1]) ] args[0] = f'【共有部分】,{t[0]}\n\n【独有部分】,{t[1]}' args[1] = f'【共有部分】,{t[2]}\n\n【独有部分】,{t[3]}' # 2 参数对齐 if not isinstance(files, (list, tuple)): files = [files] if len(files) < len(args): files += [None] * (len(args) - len(files)) ref_names = ['left', 'right', 'base'] # 3 将每个参数转成一个文件 new_args = [] default_suffix = None for i, arg in enumerate(args): f = File.safe_init(arg) if f: # 是文件对象,且存在 new_args.append(f) if not default_suffix: default_suffix = f.suffix # elif isinstance(f, File): # 文本内容也可能生成合法的伪路径,既然找不到还是统一按字符串对比差异好 # # 是文件对象,但不存在 -> 报错 # raise FileNotFoundError(f'{f}') else: # 不是文件对象,要转存到文件 if not files[i]: # 没有设置文件名则生成一个 files[i] = File(ref_names[i], Dir.TEMP, suffix=default_suffix) files[i].write(arg) new_args.append(files[i]) return new_args
def read(file, flags=None, **kwargs): """ :param file: 支持非文件路径参数,会做类型转换 因为这个接口的灵活性,要判断file参数类型等,速度会慢一点点 如果需要效率,可以显式使用imread、Image.open等明确操作类型 :param flags: -1,按照图像原样读取,保留Alpha通道(第4通道) 0,将图像转成单通道灰度图像后读取 1,将图像转换成3通道BGR彩色图像 """ from pyxllib.cv.xlpillib import xlpil if xlcv.is_cv2_image(file): im = file elif File.safe_init(file): # https://www.yuque.com/xlpr/pyxllib/imread # + np.frombuffer im = cv2.imdecode(np.fromfile(str(file), dtype=np.uint8), -1 if flags is None else flags) elif xlpil.is_pil_image(file): im = xlpil.to_cv2_image(file) else: raise TypeError(f'类型错误或文件不存在:{type(file)} {file}') return xlcv.cvt_channel(im, flags)