def read(self, extension=None, quality=None): if not extension and FORMATS[self.extension] == 'TIFF': # If the image loaded was a tiff, return the buffer created earlier. return self.buffer else: if quality is None: quality = self.context.config.QUALITY options = None self.extension = extension or self.extension try: if FORMATS[self.extension] == 'JPEG': options = [cv2.IMWRITE_JPEG_QUALITY, quality] except KeyError: options = [cv2.IMWRITE_JPEG_QUALITY, quality] if FORMATS[self.extension] == 'TIFF': channels = cv2.split(numpy.asarray(self.image)) data = self.write_channels_to_tiff_buffer(channels) else: success, numpy_data = cv2.imencode(self.extension, numpy.asarray(self.image), options or []) if success: data = numpy_data.tostring() else: raise Exception("Failed to encode image") if FORMATS[self.extension] == 'JPEG' and self.context.config.PRESERVE_EXIF_INFO: if hasattr(self, 'exif'): img = JpegFile.fromString(data) img._segments.insert(0, ExifSegment(self.exif_marker, None, self.exif, 'rw')) data = img.writeString() return data
def read(self, extension=None, quality=None): if quality is None: quality = self.context.config.QUALITY options = None extension = extension or self.extension try: if FORMATS[extension] == 'JPEG': options = [cv2.IMWRITE_JPEG_QUALITY, quality] except KeyError: # default is JPEG so options = [cv2.IMWRITE_JPEG_QUALITY, quality] try: if FORMATS[extension] == 'WEBP': options = [cv2.IMWRITE_WEBP_QUALITY, quality] except KeyError: options = [cv2.IMWRITE_JPEG_QUALITY, quality] success, buf = cv2.imencode(extension, self.image, options or []) data = buf.tostring() if FORMATS[extension] == 'JPEG' and self.context.config.PRESERVE_EXIF_INFO: if hasattr(self, 'exif') and self.exif != None: img = JpegFile.fromString(data) img._segments.insert(0, ExifSegment(self.exif_marker, None, self.exif, 'rw')) data = img.writeString() return data
def _get_exif_segment(self): try: segment = ExifSegment(None, None, self.exif, 'ro') except Exception: logger.exception('Ignored error handling exif for reorientation') else: return segment return None
def get_orientation(self, override_exif=True): if (not hasattr(self, 'exif')) or self.exif is None: return orientation = None try: segment = ExifSegment(None, None, self.exif, 'ro') primary = segment.primary orientation = primary['Orientation'] if orientation: orientation = orientation[0] if orientation != 1 and override_exif: primary['Orientation'] = [1] self.exif = segment.get_data() except Exception: logger.exception('Ignored error handling exif for reorientation') finally: return orientation
def _get_exif_segment(self): if (not hasattr(self, 'exif')) or self.exif is None: return None try: segment = ExifSegment(None, None, self.exif, 'ro') except Exception: logger.exception('Ignored error handling exif for reorientation') else: return segment return None
def _get_exif_segment(self): """ Override because the superclass doesn't check for no exif. """ segment = None try: if getattr(self, 'exif', None) is not None: segment = ExifSegment(None, None, self.exif, 'ro') except Exception: logger.warning('Ignored error handling exif for reorientation', exc_info=True) return segment
def reorientate(self): if (not hasattr(self, 'exif')) or self.exif is None: return orientation = None try: segment = ExifSegment(None, None, self.exif, 'ro') primary = segment.primary orientation = primary['Orientation'] if orientation: orientation = orientation[0] if orientation != 1: primary['Orientation'] = [1] self.exif = segment.get_data() except Exception: logger.exception('Ignored error handling exif for reorientation') if orientation == 2: self.flip_horizontally() elif orientation == 3: self.rotate(180) elif orientation == 4: self.flip_vertically() elif orientation == 5: # Horizontal Mirror + Rotation 270 self.flip_vertically() self.rotate(270) elif orientation == 6: self.rotate(270) elif orientation == 7: # Vertical Mirror + Rotation 270 self.flip_horizontally() self.rotate(270) elif orientation == 8: self.rotate(90)
def read(self, extension=None, quality=None): if not extension and FORMATS[self.extension] == 'TIFF': # If the image loaded was a tiff, return the buffer created earlier. return self.buffer else: if quality is None: quality = self.context.config.QUALITY options = None extension = extension or self.extension # Check if we should write a JPEG. If we are allowing defaulting to jpeg # and if the alpha channel is all white (opaque). channels = None if getattr(self.context.request, 'default_to_jpeg', True): channels = cv2.split(numpy.asarray(self.image)) if len(channels) > 3 and numpy.all(channels[3] == 255): extension = '.jpg' try: if FORMATS[extension] == 'JPEG': options = [cv.CV_IMWRITE_JPEG_QUALITY, quality] except KeyError: # default is JPEG so options = [cv.CV_IMWRITE_JPEG_QUALITY, quality] if FORMATS[extension] == 'TIFF': channels = channels or cv2.split(numpy.asarray(self.image)) data = self.write_channels_to_tiff_buffer(channels) else: data = cv.EncodeImage(extension, self.image, options or []).tostring() if FORMATS[ extension] == 'JPEG' and self.context.config.PRESERVE_EXIF_INFO: if hasattr(self, 'exif'): img = JpegFile.fromString(data) img._segments.insert( 0, ExifSegment(self.exif_marker, None, self.exif, 'rw')) data = img.writeString() return data