1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
from PyQt4 import QtCore, QtGui
from colors import Colors
from demoitem import DemoItem
class ImageItem(DemoItem):
def __init__(self, image, maxWidth, maxHeight, scene=None, parent=None,
adjustSize=False, scale=1.0):
super(ImageItem, self).__init__(scene, parent)
self.image = image
self.maxWidth = maxWidth
self.maxHeight = maxHeight
self.adjustSize = adjustSize
self.scale = scale
def createImage(self, matrix):
original = QtGui.QImage(self.image)
if original.isNull():
return original
size = matrix.map(QtCore.QPoint(self.maxWidth, self.maxHeight))
w = size.x()
h = size.y()
# Optimization: if image is smaller than maximum allowed size, just
# return the loaded image.
if original.size().height() <= h and original.size().width() <= w and not self.adjustSize and self.scale == 1:
return original
# Calculate what the size of the final image will be.
w = min(w, float(original.size().width()) * self.scale)
h = min(h, float(original.size().height()) * self.scale)
adjustx = 1.0
adjusty = 1.0
if self.adjustSize:
adjustx = min(matrix.m11(), matrix.m22())
adjusty = max(matrix.m22(), adjustx)
w *= adjustx
h *= adjusty
# Create a new image with correct size, and draw original on it.
image = QtGui.QImage(int(w + 2), int(h + 2),
QtGui.QImage.Format_ARGB32_Premultiplied)
image.fill(QtGui.QColor(0, 0, 0, 0).rgba())
painter = QtGui.QPainter(image)
painter.setRenderHints(QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform)
if self.adjustSize:
painter.scale(adjustx, adjusty)
if self.scale != 1:
painter.scale(self.scale, self.scale)
painter.drawImage(0, 0, original)
if not self.adjustSize:
# Blur out edges.
blur = 30
if h < original.height():
brush1 = QtGui.QLinearGradient(0, h - blur, 0, h)
brush1.setSpread(QtGui.QGradient.PadSpread)
brush1.setColorAt(0.0, QtGui.QColor(0, 0, 0, 0))
brush1.setColorAt(1.0, Colors.sceneBg1)
painter.fillRect(0, int(h) - blur, original.width(), int(h),
brush1)
if w < original.width():
brush2 = QtGui.QLinearGradient(w - blur, 0, w, 0)
brush2.setSpread(QtGui.QGradient.PadSpread)
brush2.setColorAt(0.0, QtGui.QColor(0, 0, 0, 0))
brush2.setColorAt(1.0, Colors.sceneBg1)
painter.fillRect(int(w) - blur, 0, int(w), original.height(),
brush2)
return image
|