Esempio n. 1
0
def load_image(parent, filename=None):
    nothing = [None] * 3
    settings = QSettings()
    if filename is None:
        dialog = QFileDialog(parent, parent.tr('Load image'),
                             settings.value('load_folder'))
        dialog.setOption(QFileDialog.DontUseNativeDialog, True)
        dialog.setFileMode(QFileDialog.ExistingFile)
        dialog.setViewMode(QFileDialog.Detail)
        mime_filters = [
            "image/jpeg", "image/png", "image/tiff", "image/gif", "image/bmp",
            "image/webp", "image/x-portable-pixmap",
            "image/x-portable-graymap", "image/x-portable-bitmap"
        ]
        mime_db = QMimeDatabase()
        mime_patterns = [
            mime_db.mimeTypeForName(mime).globPatterns()
            for mime in mime_filters
        ]
        all_formats = 'Supported formats ({})'.format(' '.join(
            [item for sub in mime_patterns for item in sub]))
        dialog.setMimeTypeFilters(mime_filters)
        name_filters = dialog.nameFilters()
        dialog.setNameFilters(name_filters + [all_formats])
        dialog.selectNameFilter(all_formats)
        if dialog.exec_():
            filename = dialog.selectedFiles()[0]
        else:
            return nothing
    if filename.endswith('.gif'):
        capture = cv.VideoCapture(filename)
        frames = int(capture.get(cv.CAP_PROP_FRAME_COUNT))
        if frames > 1:
            QMessageBox.warning(
                parent, parent.tr('Warning'),
                parent.tr('Animated GIF: importing first frame'))
        result, image = capture.read()
        if not result:
            QMessageBox.critical(parent, parent.tr('Error'),
                                 parent.tr('Unable to decode GIF!'))
            return nothing
        if len(image.shape) == 2:
            image = cv.cvtColor(image, cv.COLOR_GRAY2BGR)
    else:
        image = cv.imread(filename, cv.IMREAD_COLOR)
    if image is None:
        QMessageBox.critical(parent, parent.tr('Error'),
                             parent.tr('Unable to load image!'))
        return nothing
    if image.shape[2] > 3:
        QMessageBox.warning(parent, parent.tr('Warning'),
                            parent.tr('Alpha channel discarded'))
        image = cv.cvtColor(image, cv.COLOR_BGRA2BGR)
    settings.setValue('load_folder', QFileInfo(filename).absolutePath())
    return filename, os.path.basename(filename), image
Esempio n. 2
0
def load_image(parent, filename=None):
    nothing = [None] * 3
    settings = QSettings()
    mime_filters = ['image/jpeg', 'image/png', 'image/tiff', 'image/gif', 'image/bmp', 'image/webp',
                    'image/x-portable-pixmap', 'image/x-portable-graymap', 'image/x-portable-bitmap',
                    'image/x-nikon-nef', 'image/x-fuji-raf', 'image/x-canon-cr2', 'image/x-adobe-dng',
                    'image/x-sony-arw', 'image/x-kodak-dcr', 'image/x-minolta-mrw', 'image/x-pentax-pef',
                    'image/x-canon-crw', 'image/x-sony-sr2', 'image/x-olympus-orf', 'image/x-panasonic-raw']
    mime_db = QMimeDatabase()
    mime_patterns = [mime_db.mimeTypeForName(mime).globPatterns() for mime in mime_filters]
    all_formats = 'Supported formats ({})'.format(' '.join([item for sub in mime_patterns for item in sub]))
    raw_exts = [p[0][-3:] for p in mime_patterns][-12:]
    if filename is None:
        dialog = QFileDialog(parent, parent.tr('Load image'), settings.value('load_folder'))
        dialog.setOption(QFileDialog.DontUseNativeDialog, True)
        dialog.setFileMode(QFileDialog.ExistingFile)
        dialog.setViewMode(QFileDialog.Detail)
        dialog.setMimeTypeFilters(mime_filters)
        name_filters = dialog.nameFilters()
        dialog.setNameFilters(name_filters + [all_formats])
        dialog.selectNameFilter(all_formats)
        if dialog.exec_():
            filename = dialog.selectedFiles()[0]
        else:
            return nothing
    ext = os.path.splitext(filename)[1][1:].lower()
    if ext in raw_exts:
        with rawpy.imread(filename) as raw:
            image = cv.cvtColor(raw.postprocess(use_auto_wb=True), cv.COLOR_RGB2BGR)
    elif ext == 'gif':
        capture = cv.VideoCapture(filename)
        frames = int(capture.get(cv.CAP_PROP_FRAME_COUNT))
        if frames > 1:
            QMessageBox.warning(parent, parent.tr('Warning'), parent.tr('Animated GIF: importing first frame'))
        result, image = capture.read()
        if not result:
            QMessageBox.critical(parent, parent.tr('Error'), parent.tr('Unable to decode GIF!'))
            return nothing
        if len(image.shape) == 2:
            image = cv.cvtColor(image, cv.COLOR_GRAY2BGR)
    else:
        image = cv.imread(filename, cv.IMREAD_COLOR)
    if image is None:
        QMessageBox.critical(parent, parent.tr('Error'), parent.tr('Unable to load image!'))
        return nothing
    if image.shape[2] > 3:
        QMessageBox.warning(parent, parent.tr('Warning'), parent.tr('Alpha channel discarded'))
        image = cv.cvtColor(image, cv.COLOR_BGRA2BGR)
    settings.setValue('load_folder', QFileInfo(filename).absolutePath())
    return filename, os.path.basename(filename), image