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 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 _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 createScales(self, instance, value=None): """ creates scales and stores them; largely based on the version from `Archetypes.Field.ImageField` """ sizes = self.getAvailableSizes(instance) handler = IImageScaleHandler(self) for name, size in sizes.items(): width, height = size data = handler.createScale(instance, name, width, height, data=value) if data is not None: handler.storeScale(instance, name, **data)
def createScales(self, instance, value=None): """ creates scales and stores them; largely based on the version from `Archetypes.Field.ImageField` """ sizes = self.getAvailableSizes(instance) handler = IImageScaleHandler(self) for name, size in sizes.items(): width, height = size data = handler.createScale(instance, name, width, height, data=value) if data is not None: handler.storeScale(instance, name, **data)
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)