Example #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
Example #2
0
def get_subsampling(image_file):
    """
    FInd the YCBCr subsampling for the image file
    :param image_file:
    :return: 4:2:2 if the image_file is NOne or the sampling tag is not found.
    """
    if image_file is None:
        return '4:2:2'
    ss = exif.getexif(image_file, ['-f', '-n', '-args', '-YCbCrSubsampling'],
                      separator='=')
    # can only handle 4:4:4, 4:2:2, or 4:1:1
    yyval = ss['-YCbCrSubSampling'] if '-YCbCrSubSampling' in ss else ''
    mapping = {
        '2 1': 1,
        '4 1': 2,
        '4 2': 2,
        '2 4': 1,
        '2 2': 2,
        '1 1': 0,
        '1 2': 0,
        '1 4': 0
    }
    if yyval in mapping:
        return mapping[yyval]
    else:
        return 0
Example #3
0
def rerunexif(project):
    """
    Save error report, project properties, composites, and donors
    :param sm: scenario model
    """
    sm = scenario_model.ImageProjectModel(project)
    plugin_map = {
        'AntiForensicExifQuantizationTable': 'CompressAs',
        'AntiForensicCopyExif': 'ExifMetaCopy',
        'AntiForensicEditExif': 'ExifGPSChange',
        'OutputTif': 'TIFF'
    }
    for edge_id in sm.getGraph().get_edges():
        edge = sm.getGraph().get_edge(edge_id[0], edge_id[1])
        # if a compression type operation
        if edge['op'] in [
                'AntiForensicExifQuantizationTable', 'AntiForensicCopyExif',
                'AntiForensicEditExif', 'OutputTif'
        ]:
            # has donor
            preds = [
                pred for pred in sm.getGraph().predecessors(edge_id[1])
                if pred != edge_id[0]
            ]
            if len(preds) > 0:
                donor_node = sm.getGraph().get_node(preds[0])
                target_node = sm.getGraph().get_node(edge_id[1])
                im, source_filename = sm.getImageAndName(edge_id[0])
                target_filenanme = os.path.join(sm.get_dir(),
                                                target_node['file'])
                plugin_name = plugin_map[edge['op']]
                kwargs = {
                    'donor': os.path.join(sm.get_dir(), donor_node['file']),
                    'rotate': 'yes'
                }
                doc = getValue(edge, 'arguments.degrees of change')
                if doc is not None:
                    kwargs['degrees of change'] = doc
                if plugin_name == 'TIFF':
                    exif.runexif([
                        '-P', '-q', '-m', '-TagsFromFile', donor_node['file'],
                        '-all:all', '-unsafe', target_filenanme
                    ])
                    createtime = exif.getexif(
                        target_filenanme,
                        args=['-args', '-System:FileCreateDate'],
                        separator='=')
                    if createtime is not None and '-FileCreateDate' in createtime:
                        exif.runexif([
                            '-overwrite_original', '-P', '-q', '-m',
                            '-System:fileModifyDate=' +
                            createtime['-FileCreateDate'], target_filenanme
                        ])
                else:
                    plugins.callPlugin(plugin_name, im, source_filename,
                                       target_filenanme, **kwargs)
            sm.reproduceMask(edge_id=edge_id)
    sm.save()
Example #4
0
    def test_gray(self):
        img_wrapper = image_wrap.openImageFile(
            self.locateFile('tests/images/test_project5.jpg'))
        img = img_wrapper.to_array()
        img_wrapper = image_wrap.ImageWrapper(img)
        target_wrapper = image_wrap.ImageWrapper(img)
        filename = self.locateFile('tests/images/test_project5.jpg')
        filename_output = tempfile.mktemp(prefix='mstcr',
                                          suffix='.jpg',
                                          dir='.')
        self.filesToKill.extend([filename_output])
        target_wrapper.save(filename_output, format='JPEG')

        args, error = plugins.callPlugin('ExifGPSChange', img_wrapper,
                                         filename, filename_output)
        self.assertEqual(error, None)
        data = exif.getexif(filename)
        data_output = exif.getexif(filename_output)
        self.assertTrue(data['GPS Latitude'] != data_output['GPS Latitude'])
        self.assertTrue(data['GPS Longitude'] != data_output['GPS Longitude'])
Example #5
0
def get_defaults(source):
    try:
        exifdata = getexif(source)
        date, time = exifdata['Create Date'].split(" ")
        date = "-".join(date.split(":"))
    except KeyError:
        time = str(datetime.datetime.utcnow().strftime("%H:%M:%S"))
        date = str(datetime.datetime.utcnow().date())
    except TypeError:
        return False, False

    return date, time
Example #6
0
    def extract_metadata(self):
        fieldsToNotCopy = [
            '-x', 'ExifToolVersion', '-x', 'FileName', '-x', 'Directory', '-x',
            'FileSize', '-x', 'FileCreateDate', '-x', 'FilePermissions', '-x',
            'FileType', '-x', 'FileTypeExtension', '-x', 'MIMEType', '-x',
            'XMPToolkit', '-x', 'FileModifyDate', '-x', 'FileAccessDate'
        ]

        self.newExifData = getexif(self.inputFilename,
                                   args=['-all'] + fieldsToNotCopy +
                                   ['-args', '-a', '-e', '-G1'],
                                   separator='=')
Example #7
0
def get_defaults(source, logger):
    try:
        exifdata = getexif(source)
        date, time = exifdata['Create Date'].split(" ")
        date = "-".join(date.split(":"))
        logger.debug("Fetched default date and time from exif")
    except KeyError:
        time = str(datetime.datetime.utcnow().strftime("%H:%M:%S"))
        date = str(datetime.datetime.utcnow().date())
        logger.debug("Using current date and time for defaults")
    except TypeError:
        return False, False

    return date, time
Example #8
0
    def test_gray(self):
        img_wrapper = image_wrap.openImageFile(
            self.locateFile('tests/images/test_project5.jpg'))
        img = img_wrapper.to_array()
        img_wrapper = image_wrap.ImageWrapper(img)
        target_wrapper = image_wrap.ImageWrapper(img)
        filename = self.locateFile('tests/images/test_project5.jpg')
        filename_output = tempfile.mktemp(prefix='mstcr',
                                          suffix='.jpg',
                                          dir='.')
        self.filesToKill.extend([filename_output])
        target_wrapper.save(filename_output, format='JPEG')

        args, error = plugins.callPlugin('CompressAs',
                                         img_wrapper,
                                         filename,
                                         filename_output,
                                         donor=filename,
                                         rotate='yes')
        self.assertEqual(error, None)
        data = exif.getexif(filename)

        args, error = plugins.callPlugin('OutputTIFF',
                                         img_wrapper,
                                         filename,
                                         filename_output,
                                         donor=filename,
                                         **{'Image Rotated': 'yes'})
        self.assertEqual(error, None)
        data = exif.getexif(filename)

        args, error = plugins.callPlugin('OutputPNG',
                                         img_wrapper,
                                         filename,
                                         filename_output,
                                         donor=filename,
                                         rotate='yes',
                                         **{'Image Rotated': 'yes'})
        self.assertEqual(error, None)
        self.assertEqual('yes', args['Image Rotated'])
        data = exif.getexif(filename)

        args, error = plugins.callPlugin('OutputBMP',
                                         img_wrapper,
                                         filename,
                                         filename_output,
                                         donor=filename,
                                         rotate='yes',
                                         **{'Image Rotated': 'yes'})
        self.assertEqual(error, None)
        data = exif.getexif(filename)
        self.assertEqual('yes', args['Image Rotated'])

        args, error = plugins.callPlugin('OutputTIFF',
                                         img_wrapper,
                                         filename,
                                         filename_output,
                                         donor=filename,
                                         **{'Image Rotated': 'yes'})
        self.assertEqual('yes', args['Image Rotated'])
        self.assertEqual(error, None)
        data = exif.getexif(filename)
Example #9
0
def main():
    files_to_qt = {
        "iPhone6s.jpg": "iPhone6s-[{}x{}]-{}.txt",
        "Galaxy_S4.jpg": "Samsung-Galaxy-S4-[{}x{}]-{}.txt",
        "NEX-5TL.jpg": "Sony-NEX-5TL-[{}x{}]-{}.txt",
        "droid_maxx.jpg": "Motorola-Droid-Maxx-[{}x{}]-{}.txt",
        "canon_eos_sl1.jpg": "Canon-EOS-SL1-[{}x{}]-{}.txt",
        "Kodak_M1063_0_9367.JPG": "Kodak-EasyShare-M1063-[{}x{}]-{}.txt",
        "Samsung_L74wide_1_44105.JPG":
        "Samsung-Digimax-L74_Wide-[{}x{}]-{}.txt",
        "Praktica_DCZ5.9_3_35003.JPG": "Praktica-DCZ-59-[{}x{}]-{}.txt",
        "Olympus_mju_1050SW_0_23680.JPG":
        "Olympus-Stylus-1050SW-[{}x{}]-{}.txt",
        "Panasonic_DMC-FZ50_0_26019.JPG": "Panasonic-DMC-FZ50-[{}x{}]-{}.txt"
    }

    imagedir = ''
    savedir = 'maskgen/plugins/JpgFromCamera/QuantizationTables'
    for file_name_prefix in files_to_qt:
        filename = os.path.join(imagedir, file_name_prefix)
        thumbTable = None
        prevTable = None
        finalTable = None
        tables_zigzag = parse_tables(filename)
        tables_sorted = sort_tables(tables_zigzag)
        if len(tables_sorted) == 6:
            thumbTable = tables_sorted[0:2]
            prevTable = tables_sorted[2:4]
            finalTable = tables_sorted[4:6]
        elif len(tables_sorted) > 2 and len(tables_sorted) < 6:
            thumbTable = tables_sorted[0:2]
            finalTable = tables_sorted[-2:]
        else:
            finalTable = tables_sorted

        im = openImageFile(filename)
        outfilenametemplate = files_to_qt[file_name_prefix]
        dims = im.size
        if thumbTable is not None:
            dumpTable(
                os.path.join(
                    savedir,
                    outfilenametemplate.format(dims[0], dims[1], 'thumbnail')),
                thumbTable)
        if prevTable is not None:
            dumpTable(
                os.path.join(
                    savedir,
                    outfilenametemplate.format(dims[0], dims[1], 'preview')),
                prevTable)
        if finalTable is not None:
            dumpTable(
                os.path.join(
                    savedir,
                    outfilenametemplate.format(dims[0], dims[1], 'QT')),
                finalTable)
        writeExif(
            os.path.join(
                savedir,
                outfilenametemplate.format(dims[0], dims[1], 'metadata')),
            getexif(filename, args=['-args', '-G1', '-n'], separator='='))
Example #10
0
def getMakeAndModel(source):
    from maskgen import exif
    data = exif.getexif(source,['-make','-model'])
    if 'Make' not in data or 'Camera Model Name' not in data:
        return None,None
    return data['Make'],data['Camera Model Name']
Example #11
0
 def test_load(self):
     exif.getexif(self.locateFile('tests/videos/sample1.mov'))
Example #12
0
    def load_image(self):
        imageFile = tkFileDialog.askopenfilename(filetypes=[('JPEG', '*.jpg')])
        exifData = getexif(imageFile,
                           args=['-f', '-args', '-CameraMake', '-CameraModel'],
                           separator='=')

        self.make = exifData['-CameraMake']
        self.model = exifData['-CameraModel']

        if self.make == '-' or self.model == '-':
            cancel = self.prompt_for_info()
            if cancel is True:
                return

        im = Image.open(imageFile)
        (width, height) = im.size
        self.size = '[' + str(width) + 'x' + str(height) + ']'

        tables = self.parse_tables(imageFile)
        finalTables = self.sort_tables(tables)

        thumbTable = []
        prevTable = []
        if len(finalTables) == 6:
            thumbTable = finalTables[0:2]
            prevTable = finalTables[2:4]
            finalTable = finalTables[4:6]
        elif len(finalTables) > 2 and len(finalTables) < 6:
            thumbTable = finalTables[0:2]
            finalTable = finalTables[-2:]
        elif len(finalTables) < 2:
            finalTable = [finalTables, finalTables]
        else:
            finalTable = finalTables

        qtfilename = os.path.join(
            'plugins', 'JpgFromCamera', 'QuantizationTables',
            self.make + '-' + self.model + '-' + self.size + '-QT.txt')
        duplicateCount = None
        if os.path.isfile(qtfilename):
            duplicateCount = '1'
            qtfilename = qtfilename.replace('-QT.txt',
                                            '(' + duplicateCount + ')-QT.txt')
            while os.path.isfile(qtfilename):
                prevCount = duplicateCount
                duplicateCount = str(int(duplicateCount) + 1)
                qtfilename = qtfilename.replace(
                    '(' + prevCount + ')-QT.txt',
                    '(' + duplicateCount + ')-QT.txt')

        with open(qtfilename, 'w') as qtf:
            for table in finalTable:
                count = 1
                for value in table:
                    qtf.write(str(value) + '\t')
                    if count % 8 == 0:
                        qtf.write('\n')
                    count += 1
        self.filelist.insert(-1, os.path.basename(qtfilename))

        if prevTable:
            prfilename = os.path.join(
                'plugins', 'JpgFromCamera', 'QuantizationTables', self.make +
                '-' + self.model + '-' + self.size + '-preview.txt')
            if duplicateCount is not None:
                prfilename = prfilename.replace(
                    '-preview.txt', '(' + duplicateCount + ')-preview.txt')
            with open(prfilename, 'w') as qtf:
                for table in prevTable:
                    count = 1
                    for value in table:
                        qtf.write(str(value) + '\t')
                        if count % 8 == 0:
                            qtf.write('\n')
                        count += 1
            self.filelist.insert(-1, os.path.basename(prfilename))
        else:
            prfilename = ''

        if thumbTable:
            thfilename = os.path.join(
                'plugins', 'JpgFromCamera', 'QuantizationTables', self.make +
                '-' + self.model + '-' + self.size + '-thumbnail.txt')
            if duplicateCount is not None:
                thfilename = thfilename.replace(
                    '-thumbnail.txt', '(' + duplicateCount + ')-thumbnail.txt')
            with open(thfilename, 'w') as qtf:
                for table in thumbTable:
                    count = 1
                    for value in table:
                        qtf.write(str(value) + '\t')
                        if count % 8 == 0:
                            qtf.write('\n')
                        count += 1
            self.filelist.insert(-1, os.path.basename(thfilename))
        else:
            thfilename = ''

        mfilename = os.path.join(
            'plugins', 'JpgFromCamera', 'QuantizationTables',
            self.make + '-' + self.model + '-' + self.size + '-metadata.csv')
        if duplicateCount is not None:
            mfilename = mfilename.replace(
                '-metadata.csv', '(' + duplicateCount + ')-metadata.csv')
        mfilename = self.save_metadata(imageFile, mfilename)
        if mfilename is not None:
            self.filelist.insert(-1, os.path.basename(mfilename))
        else:
            mfilename = 'Metadata file was not written.'

        prfilename = prfilename + '\n' if prfilename != '' else prfilename
        thfilename = thfilename + '\n' if thfilename != '' else thfilename

        tkMessageBox.showinfo(
            'New Tables', 'The following files were added:\n' +
            os.path.basename(qtfilename) + '\n' +
            os.path.basename(prfilename) + os.path.basename(thfilename) +
            os.path.basename(mfilename))