Esempio n. 1
0
 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)
Esempio n. 2
0
    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
Esempio n. 3
0
    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)