- Improved image resizing speed

bzr-revno: 1623
This commit is contained in:
Andreas Preikschat 2011-06-10 10:24:29 +02:00
commit 2ceea5d72e
1 changed files with 20 additions and 13 deletions

View File

@ -137,13 +137,12 @@ def image_to_byte(image):
# convert to base64 encoding so does not get missed! # convert to base64 encoding so does not get missed!
return byte_array.toBase64() return byte_array.toBase64()
def resize_image(image, width, height, background=QtCore.Qt.black): def resize_image(image_path, width, height, background=QtCore.Qt.black):
""" """
Resize an image to fit on the current screen. Resize an image to fit on the current screen.
``image`` ``image_path``
The image to resize. It has to be either a ``QImage`` instance or the The path to the image to resize.
path to the image.
``width`` ``width``
The new image width. The new image width.
@ -155,16 +154,24 @@ def resize_image(image, width, height, background=QtCore.Qt.black):
The background colour defaults to black. The background colour defaults to black.
""" """
log.debug(u'resize_image - start') log.debug(u'resize_image - start')
if isinstance(image, QtGui.QImage): reader = QtGui.QImageReader(image_path)
preview = image # The image's ratio.
image_ratio = float(reader.size().width()) / float(reader.size().height())
resize_ratio = float(width) / float(height)
# Figure out the size we want to resize the image to (keep aspect ratio).
if image_ratio == resize_ratio:
size = QtCore.QSize(width, height)
elif image_ratio < resize_ratio:
# Use the image's height as reference for the new size.
size = QtCore.QSize(image_ratio * height, height)
else: else:
preview = QtGui.QImage(image) # Use the image's width as reference for the new size.
if not preview.isNull(): size = QtCore.QSize(width, 1 / (image_ratio / width))
# Only resize if different size reader.setScaledSize(size)
if preview.width() == width and preview.height == height: preview = reader.read()
return preview if image_ratio == resize_ratio:
preview = preview.scaled(width, height, QtCore.Qt.KeepAspectRatio, # We neither need to centre the image nor add "bars" to the image.
QtCore.Qt.SmoothTransformation) return preview
realw = preview.width() realw = preview.width()
realh = preview.height() realh = preview.height()
# and move it to the centre of the preview space # and move it to the centre of the preview space