def save_cropped(self, fieldname, scale, image_file): """ see interface """ field = self.get_image_field(fieldname) handler = IImageScaleHandler(field) sizes = field.getAvailableSizes(self.context) w, h = sizes[scale] data = handler.createScale(self.context, scale, w, h, data=image_file.read()) # store scale for classic <fieldname>_<scale> traversing handler.storeScale(self.context, scale, **data) # call plone.scale.storage.scale method in order to # provide saved scale for plone.app.imaging @@images view def crop_factory(fieldname, direction="keep", **parameters): blob = Blob() result = blob.open("w") _, image_format, dimensions = scaleImage(data["data"], result=result, **parameters) result.close() return blob, image_format, dimensions # Avoid browser cache # calling reindexObject updates the modified metadate too self.context.reindexObject() # call storage with actual time in milliseconds # this always invalidates old scales storage = AnnotationStorage(self.context, _millis) storage.scale(factory=crop_factory, fieldname=field.__name__, width=w, height=h)
def save_cropped( self, fieldname, field, scale, image_file, interface=None): """ see interface """ handler = IImageScaleHandler(field) sizes = field.getAvailableSizes(self.context) w, h = sizes[scale] data = handler.createScale( self.context, scale, w, h, data=image_file.read()) # store scale for classic <fieldname>_<scale> traversing handler.storeScale(self.context, scale, **data) # call plone.scale.storage.scale method in order to # provide saved scale for plone.app.imaging @@images view def crop_factory(fieldname, direction='keep', **parameters): blob = Blob() result = blob.open('w') _, image_format, dimensions = scaleImage( data['data'], result=result, **parameters) result.close() return blob, image_format, dimensions # call storage with actual time in milliseconds # this always invalidates old scales storage = AnnotationStorage(self.context, self.now_millis) storage.scale( factory=crop_factory, fieldname=field.__name__, width=w, height=h)
def _crop(self, fieldname, scale, box, interface=None): """interface just useful to locate field on dexterity types """ # https://github.com/plone/plone.app.imaging/blob/ggozad-cropping/src/ # plone/app/imaging/cropping.py field = self.context.getField(fieldname) if hasattr(field,'getHandler'): handler = field.getHandler() else: handler = IImageScaleHandler(field) # TODO this is archetype only value = field.get(self.context) data = getattr(aq_base(value), 'data', value) if isinstance(data, Pdata): data = str(data) original_file = StringIO(data) image = PIL.Image.open(original_file) image_format = image.format or self.DEFAULT_FORMAT cropped_image = image.crop(box) cropped_image_file = StringIO() cropped_image.save(cropped_image_file, image_format, quality=100) cropped_image_file.seek(0) sizes = field.getAvailableSizes(self.context) #regular scale if len(sizes[scale]) ==3: w, h, s = sizes[scale] data = handler.createScale(self.context, scale, w, h, data=cropped_image_file.read()) else: w, h = sizes[scale] data = handler.createScale(self.context, scale, w, h, data=cropped_image_file.read()) # store scale for classic <fieldname>_<scale> traversing handler.storeScale(self.context, scale, **data) # call plone.scale.storage.scale method in order to # provide saved scale for plone.app.imaging @@images view def crop_factory(fieldname, direction='keep', **parameters): blob = Blob() result = blob.open('w') _, image_format, dimensions = scaleImage(data['data'], result=result, **parameters) result.close() return blob, image_format, dimensions # call storage with actual time in milliseconds # this always invalidates old scales storage = AnnotationStorage(self.context, self.now_millis) storage.scale(factory=crop_factory, fieldname=fieldname, width=w, height=h) # store crop information in annotations self._store(fieldname, scale, box)
def scale(self, fieldname=None, scale=None, height=None, width=None, direction='thumbnail', **parameters): if fieldname is None: fieldname = IPrimaryFieldInfo(self.context).fieldname if scale is not None: available = self.getAvailableSizes(fieldname) if scale not in available: return None width, height = available[scale] if IDisableCSRFProtection and self.request is not None: alsoProvides(self.request, IDisableCSRFProtection) storage = AnnotationStorage(self.context, self.modified) info = storage.scale(factory=self.create, fieldname=fieldname, height=height, width=width, direction=direction, **parameters) if info is not None: info['fieldname'] = fieldname scale_view = ImageScale(self.context, self.request, **info) return scale_view.__of__(self.context)
def scale(self, fieldname=None, scale=None, height=None, width=None, direction='thumbnail', **parameters): # import pdb # pdb.set_trace() if fieldname is None: fieldname = IPrimaryFieldInfo(self.context).fieldname if scale is not None: available = self.getAvailableSizes(fieldname) if not scale in available: return None width, height = available[scale] if self.request is not None: alsoProvides(self.request, IDisableCSRFProtection) storage = AnnotationStorage(self.context, self.modified) info = storage.scale(factory=self.create, fieldname=fieldname, height=height, width=width, direction=direction, **parameters) if info is not None: info['fieldname'] = fieldname scale_view = ImageScale(self.context, self.request, **info) return scale_view.__of__(self.context)
def getInfo(self, fieldname=None, scale=None, height=None, width=None, **parameters): storage = AnnotationStorage(self.context, self.modified) return storage.scale( factory=self.create, fieldname=fieldname, height=height, width=width, **parameters)
def getInfo(self, fieldname=None, scale=None, height=None, width=None, **parameters): storage = AnnotationStorage(self.context, self.modified) return storage.scale( factory=self.create, fieldname=fieldname, height=height, width=width, **parameters)
def save_cropped(self, fieldname, scale, image_file): """ see interface """ sizes = getAllowedSizes() w, h = sizes[scale] def crop_factory(fieldname, **parameters): # LMU patch: remove the scale parameter _parameters = { key: value for key, value in parameters.iteritems() if key != 'scale' } result = scaleImage(image_file.read(), **_parameters) if result is not None: data, format, dimensions = result mimetype = 'image/{0:s}'.format(format.lower()) field = self.get_image_field(fieldname) value = field.__class__(data, contentType=mimetype, filename=field.filename) value.fieldname = fieldname return value, format, dimensions # call storage with actual time in milliseconds # this always invalidates old scales storage = AnnotationStorage(self.context, _millis) # We need to pass direction='thumbnail' since this is the default # used by plone.namedfile.scaling, also for retrieval of scales. # Otherwise the key under which the scaled and cropped image is # saved in plone.scale.storage.AnnotationStorage will not match the # key used for retrieval (= the cropped scaled image will not be # found) # LMU patch: add the scale parameter storage.scale( factory=crop_factory, direction='thumbnail', fieldname=fieldname, scale=scale, width=w, height=h, )
def scale( self, fieldname=None, scale=None, height=None, width=None, direction="thumbnail", **parameters ): if fieldname is None: primary_field = IPrimaryFieldInfo(self.context, None) if primary_field is None: return # 404 fieldname = primary_field.fieldname if scale is not None: if width is not None or height is not None: logger.warn( "A scale name and width/heigth are given. Those are" "mutually exclusive: solved by ignoring width/heigth and " "taking name", ) available = self.available_sizes if scale not in available: return None # 404 width, height = available[scale] if IDisableCSRFProtection and self.request is not None: alsoProvides(self.request, IDisableCSRFProtection) storage = AnnotationStorage( self.context, functools.partial(self.modified, fieldname) ) info = storage.scale( fieldname=fieldname, height=height, width=width, direction=direction, scale=scale, **parameters ) if info is None: return # 404 info["srcset"] = self.calculate_srcset( fieldname=fieldname, height=height, width=width, direction=direction, scale=scale, storage=storage, **parameters ) info["fieldname"] = fieldname scale_view = self._scale_view_class(self.context, self.request, **info) return scale_view
def save_cropped(self, fieldname, scale, image_file): """ see interface """ field = self.get_image_field(fieldname) handler = IImageScaleHandler(field) sizes = field.getAvailableSizes(self.context) w, h = sizes[scale] data = handler.createScale(self.context, scale, w, h, data=image_file.read()) # store scale for classic <fieldname>_<scale> traversing handler.storeScale(self.context, scale, **data) # call plone.scale.storage.scale method in order to # provide saved scale for plone.app.imaging @@images view def crop_factory(fieldname, direction='keep', **parameters): blob = Blob() result = blob.open('w') _, image_format, dimensions = scaleImage(data['data'], result=result, **parameters) result.close() return blob, image_format, dimensions # Avoid browser cache # calling reindexObject updates the modified metadate too self.context.reindexObject() # call storage with actual time in milliseconds # this always invalidates old scales storage = AnnotationStorage(self.context, _millis) storage.scale(factory=crop_factory, fieldname=field.__name__, width=w, height=h)
def scale(self, fieldname=None, scale=None, height=None, width=None, **parameters): if scale is not None: available = self.getAvailableSizes(fieldname) if not scale in available: return None width, height = available[scale] if width is None and height is None: field = self.field(fieldname) return field.get(self.context) storage = AnnotationStorage(self.context, self.modified) info = storage.scale(factory=self.create, fieldname=fieldname, height=height, width=width, **parameters) if info is not None: return self.make(info).__of__(self.context)
def save_cropped( self, fieldname, field, scale, image_file, interface=None): """ see interface """ sizes = getAllowedSizes() w, h = sizes[scale] def crop_factory(fieldname, **parameters): result = scaleImage(image_file.read(), **parameters) if result is not None: data, format, dimensions = result mimetype = 'image/%s' % format.lower() value = field.__class__( data, contentType=mimetype, filename=field.filename ) value.fieldname = fieldname return value, format, dimensions # call storage with actual time in milliseconds # this always invalidates old scales storage = AnnotationStorage(self.context, self.now_millis) # We need to pass direction='thumbnail' since this is the default # used by plone.namedfile.scaling, also for retrieval of scales. # Otherwise the key under which the scaled and cropped image is # saved in plone.scale.storage.AnnotationStorage will not match the # key used for retrieval (= the cropped scaled image will not be # found) storage.scale( factory=crop_factory, direction='thumbnail', fieldname=fieldname, width=w, height=h, )
def scale(self, fieldname=None, scale=None, height=None, width=None, **parameters): if fieldname is None: fieldname = IPrimaryFieldInfo(self.context).fieldname if scale is not None: available = self.getAvailableSizes(fieldname) if not scale in available: return None width, height = available[scale] storage = AnnotationStorage(self.context, self.modified) info = storage.scale(factory=self.create, fieldname=fieldname, height=height, width=width, **parameters) if info is not None: info['fieldname'] = fieldname scale_view = ImageScale(self.context, self.request, **info) return scale_view.__of__(self.context)
def scale( self, fieldname=None, scale=None, height=None, width=None, direction='thumbnail', **parameters ): if fieldname is None: primary_field = IPrimaryFieldInfo(self.context, None) if primary_field is None: return # 404 fieldname = primary_field.fieldname if scale is not None: if width is not None or height is not None: logger.warn( 'A scale name and width/heigth are given. Those are' 'mutually exclusive: solved by ignoring width/heigth and ' 'taking name' ) available = self.available_sizes if scale not in available: return None # 404 width, height = available[scale] if IDisableCSRFProtection and self.request is not None: alsoProvides(self.request, IDisableCSRFProtection) storage = AnnotationStorage(self.context, self.modified) info = storage.scale( fieldname=fieldname, height=height, width=width, direction=direction, scale=scale, **parameters ) if info is None: return # 404 info['fieldname'] = fieldname scale_view = ImageScale(self.context, self.request, **info) return scale_view.__of__(self.context)
def __call__(self): form = self.request.form size = form.get('size', form.get('s', None)) if size is None: # return original - no scaling required return self.context.index_html(self.request, self.request.RESPONSE) else: size = int(size) if not IAttributeAnnotatable.providedBy(self.context): alsoProvides(self.context, IAttributeAnnotatable) storage = AnnotationStorage(self.context) scale = storage.scale(self.scale_factory, width=size, height=size) response = self.request.RESPONSE response.setHeader('Last-Modified', rfc1123_date(scale['modified'])) response.setHeader('Content-Type', scale['mimetype']) response.setHeader('Content-Length', len(scale['data'])) response.setHeader('Accept-Ranges', 'bytes') return scale['data']