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
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
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()
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'])
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
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='=')
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
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)
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='='))
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']
def test_load(self): exif.getexif(self.locateFile('tests/videos/sample1.mov'))
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))