def colorize_picture(picture, color): """ Applies a color overlay to a picture, emulating the ArcMap results """ if issubclass(picture.__class__, StdPicture): picture = picture.picture image = QImage() image.loadFromData(picture.content) if image.isNull(): raise UnreadablePictureException('Could not read embedded picture data') image = image.convertToFormat(QImage.Format_ARGB32) ucharptr = image.bits() ucharptr.setsize(image.byteCount() * image.height()) # assume top left pixel is transparent? c = image.pixelColor(0, 0) trans_rgba = qRgba(c.red(), c.green(), c.blue(), c.alpha()) actual_trans_rgba = qRgba(c.red(), c.green(), c.blue(), 0) for y in range(image.height()): start = y * image.width() * 4 for x in range(image.width()): x_start = x * 4 + start rgba = struct.unpack('I', ucharptr[x_start:x_start + 4])[0] if rgba == trans_rgba: ucharptr[x_start:x_start + 4] = struct.pack('I', actual_trans_rgba) if color is None or color.is_null: return image fg_color = ColorConverter.color_to_qcolor(color) if not fg_color.isValid(): return image alpha = QImage(image) image.detach() p = QPainter(image) p.setCompositionMode(QPainter.CompositionMode_SourceIn) p.setBrush(fg_color) p.drawRect(image.rect()) p.setCompositionMode(QPainter.CompositionMode_Multiply) p.drawImage(0, 0, alpha) p.end() return image
def colorize_picture_data(data, color: QColor, fix_alpha=True): """ Colorizes picture data """ image = QImage() image.loadFromData(data) if image.isNull(): raise UnreadablePictureException('Could not read embedded picture data') image = image.convertToFormat(QImage.Format_ARGB32) ucharptr = image.bits() ucharptr.setsize(image.byteCount() * image.height()) # assume top left pixel is transparent? if fix_alpha: c = image.pixelColor(0, 0) trans_rgba = qRgba(c.red(), c.green(), c.blue(), c.alpha()) actual_trans_rgba = qRgba(c.red(), c.green(), c.blue(), 0) for y in range(image.height()): start = y * image.width() * 4 for x in range(image.width()): x_start = x * 4 + start rgba = struct.unpack('I', ucharptr[x_start:x_start + 4])[0] if rgba == trans_rgba: ucharptr[x_start:x_start + 4] = struct.pack('I', actual_trans_rgba) if not color.isValid(): return image alpha = QImage(image) image.detach() p = QPainter(image) p.setCompositionMode(QPainter.CompositionMode_SourceIn) p.setBrush(color) p.drawRect(image.rect()) p.setCompositionMode(QPainter.CompositionMode_Multiply) p.drawImage(0, 0, alpha) p.end() return image