Commit 96d99536 authored by Jérome Perrin's avatar Jérome Perrin

safeimage: py3

parent 6f40af49
...@@ -16,9 +16,8 @@ ...@@ -16,9 +16,8 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
############################################################################## ##############################################################################
from __future__ import print_function import io
import os, sys, shutil, tempfile import os, sys, shutil, tempfile
from six.moves import cStringIO as StringIO
from zLOG import LOG,ERROR,INFO,WARNING from zLOG import LOG,ERROR,INFO,WARNING
from OFS.Image import File, Image from OFS.Image import File, Image
import os, transaction import os, transaction
...@@ -44,7 +43,7 @@ class ZoomifyBase: ...@@ -44,7 +43,7 @@ class ZoomifyBase:
_v_tileGroupMappings = {} _v_tileGroupMappings = {}
qualitySetting = 80 qualitySetting = 80
tileSize = 256 tileSize = 256
my_file = StringIO() my_file = io.BytesIO()
def openImage(self): def openImage(self):
""" load the image data """ """ load the image data """
...@@ -62,15 +61,15 @@ class ZoomifyBase: ...@@ -62,15 +61,15 @@ class ZoomifyBase:
width, height = (self.originalWidth, self.originalHeight) width, height = (self.originalWidth, self.originalHeight)
self._v_scaleInfo = [(width, height)] self._v_scaleInfo = [(width, height)]
while (width > self.tileSize) or (height > self.tileSize): while (width > self.tileSize) or (height > self.tileSize):
width, height = (width / 2, height / 2) width, height = (width // 2, height // 2)
self._v_scaleInfo.insert(0, (width, height)) self._v_scaleInfo.insert(0, (width, height))
totalTiles=0 totalTiles=0
tier, rows, columns = (0,0,0) tier, rows, columns = (0,0,0)
for tierInfo in self._v_scaleInfo: for tierInfo in self._v_scaleInfo:
rows = height/self.tileSize rows = height // self.tileSize
if height % self.tileSize > 0: if height % self.tileSize > 0:
rows +=1 rows +=1
columns = width/self.tileSize columns = width // self.tileSize
if width%self.tileSize > 0: if width%self.tileSize > 0:
columns += 1 columns += 1
totalTiles += rows * columns totalTiles += rows * columns
...@@ -87,7 +86,7 @@ class ZoomifyBase: ...@@ -87,7 +86,7 @@ class ZoomifyBase:
width, height = (self.originalWidth, self.originalHeight) width, height = (self.originalWidth, self.originalHeight)
self._v_scaleInfo = [(width, height)] self._v_scaleInfo = [(width, height)]
while (width > self.tileSize) or (height > self.tileSize): while (width > self.tileSize) or (height > self.tileSize):
width, height = (width / 2, height / 2) width, height = (width // 2, height // 2)
self._v_scaleInfo.insert(0, (width, height)) self._v_scaleInfo.insert(0, (width, height))
# tile and tile group information # tile and tile group information
self.preProcess() self.preProcess()
...@@ -146,7 +145,7 @@ class ZoomifyBase: ...@@ -146,7 +145,7 @@ class ZoomifyBase:
xmlOutput = '<IMAGE_PROPERTIES WIDTH="%s" HEIGHT="%s" NUMTILES="%s" NUMIMAGES="1" VERSION="1.8" TILESIZE="%s" />' xmlOutput = '<IMAGE_PROPERTIES WIDTH="%s" HEIGHT="%s" NUMTILES="%s" NUMIMAGES="1" VERSION="1.8" TILESIZE="%s" />'
xmlOutput = xmlOutput % (str(self.originalWidth), xmlOutput = xmlOutput % (str(self.originalWidth),
str(self.originalHeight), str(numberOfTiles), str(self.tileSize)) str(self.originalHeight), str(numberOfTiles), str(self.tileSize))
return xmlOutput return xmlOutput.encode()
def saveXMLOutput(self): def saveXMLOutput(self):
""" save xml metadata about the tiles """ """ save xml metadata about the tiles """
...@@ -176,15 +175,14 @@ class ZoomifyBase: ...@@ -176,15 +175,14 @@ class ZoomifyBase:
lr_y = ul_y + self.tileSize lr_y = ul_y + self.tileSize
else: else:
lr_y = self.originalHeight lr_y = self.originalHeight
print("Going to open image")
imageRow = image.crop([0, ul_y, self.originalWidth, lr_y]) imageRow = image.crop([0, ul_y, self.originalWidth, lr_y])
saveFilename = root + str(tier) + '-' + str(row) + ext saveFilename = root + str(tier) + '-' + str(row) + ext
if imageRow.mode != 'RGB': if imageRow.mode != 'RGB':
imageRow = imageRow.convert('RGB') imageRow = imageRow.convert('RGB')
imageRow.save(os.path.join(tempfile.gettempdir(), saveFilename), imageRow.save(os.path.join(tempfile.gettempdir(), saveFilename),
'JPEG', quality=100) # see https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#jpeg-saving
print("os path exist : %r" % os.path.exists(os.path.join( # for quality, Values above 95 should be avoided;
tempfile.gettempdir(), saveFilename))) 'JPEG', quality=95)
if os.path.exists(os.path.join(tempfile.gettempdir(), saveFilename)): if os.path.exists(os.path.join(tempfile.gettempdir(), saveFilename)):
self.processRowImage(tier=tier, row=row) self.processRowImage(tier=tier, row=row)
row += 1 row += 1
...@@ -192,9 +190,8 @@ class ZoomifyBase: ...@@ -192,9 +190,8 @@ class ZoomifyBase:
def processRowImage(self, tier=0, row=0): def processRowImage(self, tier=0, row=0):
""" for an image, create and save tiles """ """ for an image, create and save tiles """
print('*** processing tier: ' + str(tier) + ' row: ' + str(row))
tierWidth, tierHeight = self._v_scaleInfo[tier] tierWidth, tierHeight = self._v_scaleInfo[tier]
rowsForTier = tierHeight/self.tileSize rowsForTier = tierHeight // self.tileSize
if tierHeight % self.tileSize > 0: if tierHeight % self.tileSize > 0:
rowsForTier +=1 rowsForTier +=1
root, ext = os.path.splitext(self._v_imageFilename) root, ext = os.path.splitext(self._v_imageFilename)
...@@ -261,7 +258,7 @@ class ZoomifyBase: ...@@ -261,7 +258,7 @@ class ZoomifyBase:
# a bug was discovered when a row was exactly 1 pixel in height # a bug was discovered when a row was exactly 1 pixel in height
# this extra checking accounts for that # this extra checking accounts for that
if imageHeight > 1: if imageHeight > 1:
tempImage = imageRow.resize((imageWidth/2, imageHeight/2), tempImage = imageRow.resize((imageWidth//2, imageHeight//2),
PIL_Image.ANTIALIAS) PIL_Image.ANTIALIAS)
tempImage.save(os.path.join(tempfile.gettempdir(), root + str(tier) tempImage.save(os.path.join(tempfile.gettempdir(), root + str(tier)
+ '-' + str(row) + ext)) + '-' + str(row) + ext))
...@@ -269,9 +266,9 @@ class ZoomifyBase: ...@@ -269,9 +266,9 @@ class ZoomifyBase:
rowImage = None rowImage = None
if tier > 0: if tier > 0:
if row % 2 != 0: if row % 2 != 0:
self.processRowImage(tier=(tier-1), row=((row-1)/2)) self.processRowImage(tier=(tier-1), row=((row-1)//2))
elif row == rowsForTier-1: elif row == rowsForTier-1:
self.processRowImage(tier=(tier-1), row=(row/2)) self.processRowImage(tier=(tier-1), row=(row//2))
def ZoomifyProcess(self, imageNames): def ZoomifyProcess(self, imageNames):
""" the method the client calls to generate zoomify metadata """ """ the method the client calls to generate zoomify metadata """
...@@ -335,7 +332,7 @@ class ZoomifyZopeProcessor(ZoomifyBase): ...@@ -335,7 +332,7 @@ class ZoomifyZopeProcessor(ZoomifyBase):
def openImage(self): def openImage(self):
""" load the image data """ """ load the image data """
return PIL_Image.open(self._v_imageObject.name) return PIL_Image.open(self._v_imageObject)
def createDefaultViewer(self): def createDefaultViewer(self):
""" add the default Zoomify viewer to the Zoomify metadata """ """ add the default Zoomify viewer to the Zoomify metadata """
...@@ -411,7 +408,7 @@ class ZoomifyZopeProcessor(ZoomifyBase): ...@@ -411,7 +408,7 @@ class ZoomifyZopeProcessor(ZoomifyBase):
tileFileName = self.getTileFileName(scaleNumber, column, row) tileFileName = self.getTileFileName(scaleNumber, column, row)
tileContainerName = self.getAssignedTileContainerName( tileContainerName = self.getAssignedTileContainerName(
tileFileName=tileFileName) tileFileName=tileFileName)
tileImageData = StringIO() tileImageData = io.BytesIO()
image.save(tileImageData, 'JPEG', quality=self.qualitySetting) image.save(tileImageData, 'JPEG', quality=self.qualitySetting)
tileImageData.seek(0) tileImageData.seek(0)
if hasattr(self._v_saveFolderObject, tileContainerName): if hasattr(self._v_saveFolderObject, tileContainerName):
...@@ -529,7 +526,7 @@ class ERP5ZoomifyZopeProcessor(ZoomifyZopeProcessor): ...@@ -529,7 +526,7 @@ class ERP5ZoomifyZopeProcessor(ZoomifyZopeProcessor):
param2 = 0 param2 = 0
my_text = '%s %s %s %s %s %s \n' %(tile_group_id, tile_title, my_text = '%s %s %s %s %s %s \n' %(tile_group_id, tile_title,
algorithm, param1, param2, num) algorithm, param1, param2, num)
self.my_file.write(my_text) self.my_file.write(my_text.encode())
num = num - 1 num = num - 1
...@@ -543,7 +540,7 @@ class ERP5ZoomifyZopeProcessor(ZoomifyZopeProcessor): ...@@ -543,7 +540,7 @@ class ERP5ZoomifyZopeProcessor(ZoomifyZopeProcessor):
if w != 0 and h !=0: if w != 0 and h !=0:
tile_group_id = self.getAssignedTileContainerName() tile_group_id = self.getAssignedTileContainerName()
tile_group=self.document[tile_group_id] tile_group=self.document[tile_group_id]
tileImageData= StringIO() tileImageData= io.BytesIO()
image.save(tileImageData, 'JPEG', quality=self.qualitySetting) image.save(tileImageData, 'JPEG', quality=self.qualitySetting)
tileImageData.seek(0) tileImageData.seek(0)
if tile_group is None: if tile_group is None:
...@@ -556,11 +553,11 @@ class ERP5ZoomifyZopeProcessor(ZoomifyZopeProcessor): ...@@ -556,11 +553,11 @@ class ERP5ZoomifyZopeProcessor(ZoomifyZopeProcessor):
def saveXMLOutput(self): def saveXMLOutput(self):
"""save the xml file""" """save the xml file"""
my_string = StringIO() my_file = io.BytesIO()
my_string.write(self.getXMLOutput()) my_file.write(self.getXMLOutput())
my_string.seek(0) my_file.seek(0)
self.document.newContent(portal_type='Embedded File', self.document.newContent(portal_type='Embedded File',
id='ImageProperties.xml', file=my_string, id='ImageProperties.xml', file=my_file,
filename='ImageProperties.xml') filename='ImageProperties.xml')
return return
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment