Esempio n. 1
0
def transform(im, source, target, **kwargs):
    analysis = {}
    if 'donor' in kwargs and 'Image Rotated' in kwargs and kwargs[
            'Image Rotated'] == 'yes':
        im, analysis = check_rotate(im, kwargs['donor'])
    else:
        im = Image.fromarray(np.asarray(im))
    im.save(target, format='BMP')

    if 'donor' in kwargs:
        donor = kwargs['donor']
        exif.runexif(
            ['-overwrite_original', '-P', '-q', '-m', '-XMPToolkit=', target])
        exif.runexif(['-overwrite_original', '-q', '-all=', target])
        exif.runexif([
            '-overwrite_original', '-P', '-q', '-m', '-TagsFromFile', donor,
            '-all:all', '-unsafe', target
        ])
    createtime = exif.getexif(target,
                              args=['-args', '-System:FileCreateDate'],
                              separator='=')
    if '-FileCreateDate' in createtime:
        exif.runexif([
            '-overwrite_original', '-P', '-q', '-m',
            '-System:fileModifyDate=' + createtime['-FileCreateDate'], target
        ])
    analysis['Image Rotated'] = 'yes' if 'rotation' in analysis else 'no'
    return analysis, None
Esempio n. 2
0
def tiff_save_as(source_img, source, target, donor_file, rotate):
    """
    Saves image file using the same image compression
    :param source: string filename of source image
    :param target: string filename of target (result)
    :param donor: string filename of donor TIFF
    :param rotate: boolean True if counter rotation is required
    """
    analysis = {}
    if donor_file is not None:
        donor_img = openImageFile(donor_file)
        # if donor_file is a tiff, donor_img.info will have tiff information
        if rotate:
            source_img, analysis = check_rotate(source_img, donor_file)
        #try:
        #    tables_zigzag = parse_tables(donor_file)
        #    tables_sorted = sort_tables(tables_zigzag)
        #    source_img.save(target, qtables=tables_sorted[0:2], quality=0)
        #except:
        source_img.save(target,
                        format='TIFF',
                        compress=donor_img.info['compression']
                        if 'compression' in donor_img.info else 0)
        #im.save(target, format='TIFF')
        maskgen.exif.runexif(
            ['-overwrite_original', '-P', '-q', '-m', '-XMPToolkit=', target])
        maskgen.exif.runexif(['-overwrite_original', '-q', '-all=', target])
        maskgen.exif.runexif([
            '-P', '-q', '-m', '-TagsFromFile', donor_file, '-all:all',
            '-unsafe', target
        ])
    else:
        im = Image.fromarray(np.asarray(source_img))
        im.save(target, format='TIFF')
    createtime = maskgen.exif.getexif(target,
                                      args=['-args', '-System:FileCreateDate'],
                                      separator='=')
    if '-FileCreateDate' in createtime:
        maskgen.exif.runexif([
            '-overwrite_original', '-P', '-q', '-m',
            '-System:fileModifyDate=' + createtime['-FileCreateDate'], target
        ])
    return analysis
Esempio n. 3
0
def cs_save_as(img, source, target, donor, qTables, rotate, quality,
               color_mode):
    import os
    import tempfile
    from PIL import Image
    import numpy as np
    from maskgen.jpeg.utils import get_subsampling, parse_tables, sort_tables, check_rotate
    import maskgen.exif
    import maskgen
    from maskgen import image_wrap
    """
    Saves image file using quantization tables
    :param ImageWrapper
    :param source: string filename of source image
    :param target: string filename of target (result)
    :param donor: string filename of donor JPEG
    :param qTables: list of lists containing jpg quantization tables
    :param rotate: boolean True if counter rotation is required
    """

    # much of the time, images will have thumbnail tables included.
    # from what I've seen the thumbnail tables always come first...
    thumbTable = []
    prevTable = []
    if len(qTables) == 6:
        thumbTable = qTables[0:2]
        prevTable = qTables[2:4]
        finalTable = qTables[4:6]
    elif len(qTables) > 2 and len(qTables) < 6:
        thumbTable = qTables[0:2]
        finalTable = qTables[-2:]
    else:
        finalTable = qTables

    if img.mode == 'RGBA':
        im = Image.fromarray(np.asarray(img.convert('RGB')))
    else:
        im = Image.fromarray(np.asarray(img))

    if color_mode == 'from donor':
        donor_img = image_wrap.openImageFile(donor)
        if donor_img.mode != img.mode:
            im = Image.fromarray(np.asarray(img.convert(donor_img.mode)))

    analysis = None
    if rotate:
        im, analysis = check_rotate(im, donor)
    sbsmp = get_subsampling(donor)
    try:
        if len(finalTable) > 0:
            im.save(target,
                    subsampling=sbsmp,
                    qtables=finalTable,
                    quality=quality)
        else:
            im.save(target,
                    subsampling=sbsmp,
                    quality=quality if quality > 0 else 100)
    except:
        im.save(target)
    width, height = im.size
    maskgen.exif.runexif(['-overwrite_original', '-q', '-all=', target])
    maskgen.exif.runexif([
        '-overwrite_original', '-P', '-q', '-m', '-tagsFromFile', donor,
        '-all:all>all:all', '-unsafe', target
    ])

    # Preview is not well standardized in JPG (unlike thumbnail), so it doesn't always work.
    if prevTable:
        im.thumbnail((320, 320))
        fd, tempFile = tempfile.mkstemp(suffix='.jpg')
        os.close(fd)
        try:
            im.save(tempFile,
                    subsampling=sbsmp,
                    qtables=prevTable,
                    quality=quality)
            maskgen.exif.runexif([
                '-overwrite_original', '-P', '-q', '-m',
                '-PreviewImage<=' + tempFile + '', target
            ])
        except OverflowError:
            prevTable[:] = [[(x - 128) for x in row] for row in prevTable]
            try:
                im.save(tempFile,
                        subsampling=sbsmp,
                        qtables=prevTable,
                        quality=quality)
                maskgen.exif.runexif([
                    '-overwrite_original', '-P', '-q', '-m',
                    '-PreviewImage<=' + tempFile + '', target
                ])
            except Exception as e:
                logging.getLogger('maskgen').error(
                    'Preview generation failed {}'.fomat(str(e)))
        finally:
            os.remove(tempFile)

    if thumbTable:
        im.thumbnail((128, 128))
        fd, tempFile = tempfile.mkstemp(suffix='.jpg')
        os.close(fd)
        try:
            im.save(tempFile,
                    subsampling=sbsmp,
                    qtables=thumbTable,
                    quality=quality)
            maskgen.exif.runexif([
                '-overwrite_original', '-P', '-q', '-m',
                '-ThumbnailImage<=' + tempFile + '', target
            ])
        except OverflowError:
            thumbTable[:] = [[(x - 128) for x in row] for row in thumbTable]
            try:
                im.save(tempFile,
                        subsampling=sbsmp,
                        qtables=thumbTable,
                        quality=quality)
                maskgen.exif.runexif([
                    '-overwrite_original', '-P', '-q', '-m',
                    '-ThumbnailImage<=' + tempFile + '', target
                ])
            except Exception as e:
                logging.getLogger('maskgen').error(
                    'Thumbnail generation failed {}'.fomat(str(e)))
        finally:
            os.remove(tempFile)
    maskgen.exif.runexif([
        '-overwrite_original', '-P', '-q', '-m', '-XMPToolkit=',
        '-ExifImageWidth=' + str(width), '-ImageWidth=' + str(width),
        '-ExifImageHeight=' + str(height), '-ImageHeight=' + str(height),
        target
    ])
    createtime = maskgen.exif.getexif(target,
                                      args=['-args', '-System:FileCreateDate'],
                                      separator='=')
    if '-FileCreateDate' in createtime:
        maskgen.exif.runexif([
            '-overwrite_original', '-P', '-q', '-m',
            '-System:fileModifyDate=' + createtime['-FileCreateDate'], target
        ])
    return analysis
Esempio n. 4
0
def save_as_camera(source,
                   target,
                   donor,
                   imageTable,
                   prevTable,
                   thumbTable,
                   qtfile,
                   rotate=False,
                   subsampling="4:2:2",
                   quality=0):
    import rawpy
    """
    Saves a raw format image with a particular camera's tables, from database.
    """
    # write jpeg with specified tables
    if source.lower().endswith(('tif', 'tiff', 'png', 'jpg')):
        im = openImageFile(source)
        im = im.toPIL()
    else:
        try:
            with rawpy.imread(source) as raw:
                rgb = raw.postprocess()
                im = Image.fromarray(rgb, 'RGB')
        except:
            logging.getLogger('maskgen').warn('Unsupported filetype. (' +
                                              source + ')')
            return

    analysis = None
    if rotate:
        im, analysis = check_rotate(im, donor)

    #check_size(im, qtfile)
    im.save(target,
            subsampling=subsampling,
            qtables=imageTable,
            quality=quality)
    maskgen.exif.runexif(
        ['-overwrite_original', '-P', '-q', '-m', '-all=', target])

    if prevTable:
        im.thumbnail((128, 128))
        fd, tempFile = tempfile.mkstemp(suffix='.jpg')
        os.close(fd)
        try:
            im.save(tempFile,
                    subsampling=1,
                    qtables=prevTable,
                    quality=quality)
            maskgen.exif.runexif([
                '-overwrite_original', '-P', '-PreviewImage<=' + tempFile + '',
                target
            ])
        except OverflowError:
            prevTable[:] = [[(x - 128) for x in row] for row in prevTable]
            try:
                im.save(tempFile, subsampling=1, qtables=prevTable)
                maskgen.exif.runexif([
                    '-overwrite_original', '-P',
                    '-PreviewImage<=' + tempFile + '', target
                ])
            except Exception as e:
                logging.getLogger('maskgen').warn(
                    'Preview generation failed : {}'.format(str(e)))
        finally:
            os.remove(tempFile)

    (databaseArgs, donorArgs,
     calcArgs) = parse_metadata_args(qtfile, donor, target)
    maskgen.exif.runexif(['-overwrite_original', '-P', '-q', '-m', '-unsafe'] +
                         databaseArgs + donorArgs + calcArgs + [target])

    if thumbTable:
        im.thumbnail((128, 128))
        fd, tempFile = tempfile.mkstemp(suffix='.jpg')
        os.close(fd)
        try:
            im.save(tempFile, subsampling=1, qtables=thumbTable)
            maskgen.exif.runexif([
                '-overwrite_original', '-P',
                '-ThumbnailImage<=' + tempFile + '', target
            ])
        except OverflowError:
            thumbTable[:] = [[(x - 128) for x in row] for row in thumbTable]
            try:
                im.save(tempFile, subsampling=1, qtables=thumbTable)
                maskgen.exif.runexif([
                    '-overwrite_original', '-P',
                    '-ThumbnailImage<=' + tempFile + '', target
                ])
            except Exception as e:
                logging.getLogger('maskgen').warn(
                    'Thumbnail generation failed: {}'.format(str(e)))
        finally:
            os.remove(tempFile)

    maskgen.exif.runexif(
        ['-overwrite_original', '-P', '-q', '-m', '-XMPToolkit=', target])
    return analysis