def _get_previews(self): """Extract previews.""" if len(self.metadata.get_preview_properties()) > 0: # Fetched previews key. self.results["preview"] = [] for preview in self.metadata.get_preview_properties(): p = AutoVivification() p["mime_type"] = preview.get_mime_type() p["size"] = len(self.metadata.get_preview_image(preview).get_data()) p["ext"] = preview.get_extension() p["dimensions"] = [preview.get_width(), preview.get_height()] # Resize if needed, and store. try: img = utils.str2image(self.metadata.get_preview_image(preview).get_data()) if preview.get_width() > 256 or preview.get_height() > 160: p["original_file"] = save_file(utils.image2str(img), content_type="image/jpeg") img.thumbnail([256, 160], Image.ANTIALIAS) p["file"] = save_file(utils.image2str(img), content_type="image/jpeg") except Exception as e: logger.warning("Error reading preview: {0}".format(e)) continue finally: # Save. self.results["preview"].append(p)
def _get_previews(self): """Extract previews.""" if len(self.metadata.get_preview_properties()) > 0: # Fetched previews key. self.results["preview"] = [] for preview in self.metadata.get_preview_properties(): p = AutoVivification() p["mime_type"] = preview.get_mime_type() p["size"] = len( self.metadata.get_preview_image(preview).get_data()) p["ext"] = preview.get_extension() p["dimensions"] = [preview.get_width(), preview.get_height()] # Resize if needed, and store. try: img = utils.str2image( self.metadata.get_preview_image(preview).get_data()) if preview.get_width() > 256 or preview.get_height() > 160: p["original_file"] = save_file( utils.image2str(img), content_type="image/jpeg") img.thumbnail([256, 160], Image.ANTIALIAS) p["file"] = save_file(utils.image2str(img), content_type="image/jpeg") except Exception as e: logger.warning("Error reading preview: {0}".format(e)) continue finally: # Save. self.results["preview"].append(p)
def run(self): """Run data analysis.""" # Create temporary file. handle, resaved = tempfile.mkstemp() # Open file and resave it. try: im = Image.open(self.file_path) im.save(resaved, "JPEG", quality=95) resaved_im = Image.open(resaved) except IOError as e: logger.warning("ELA error opening image: {0}".format(e)) return finally: os.close(handle) os.remove(resaved) # Trick to convert images like PNG to a format comparable with JPEG. if im.mode != "RGB": im = im.convert("RGB") # Create ELA image. try: ela_im = ImageChops.difference(im, resaved_im) except Exception as e: logger.warning("Unable to calculate ELA difference: {0}".format(e)) return # Calculate difference extrema = ela_im.getextrema() max_diff = max([ex[1] for ex in extrema]) if not max_diff: return scale = 255.0 / max_diff ela_im = ImageEnhance.Brightness(ela_im).enhance(scale) self.results["max_difference"] = max([ex[1] for ex in extrema]) # Resize image if it's too big. width, height = ela_im.size if width > 1800: ela_im.thumbnail([1800, 1800], Image.ANTIALIAS) # Save image. try: img = utils.image2str(ela_im) self.results["ela_image"] = save_file(img, content_type="image/jpeg") except Exception as e: logger.warning("ELA error saving image: {0}".format(e)) finally: return self.results