def get_html_img(scene): """ Create HTML img element with base64-encoded image from the scene """ byte_array = QByteArray() filename = QBuffer(byte_array) filename.open(QIODevice.WriteOnly) PngFormat.write(filename, scene) img_encoded = byte_array.toBase64().data().decode("utf-8") return "<img src='data:image/png;base64,%s'/>" % img_encoded
def get_html_img(scene: QGraphicsScene, max_height: Optional[int] = None) -> str: """ Create HTML img element with base64-encoded image from the scene. If max_height is not none set the max height of the image in html. """ byte_array = QByteArray() filename = QBuffer(byte_array) filename.open(QIODevice.WriteOnly) PngFormat.write(filename, scene) img_encoded = byte_array.toBase64().data().decode("utf-8") return '<img {} src="data:image/png;base64,{}"/>'.format( ("" if max_height is None else 'style="max-height: {}px"'.format(max_height)), img_encoded)
def grab_svg(scene): # type: (QGraphicsScene) -> str """ Return a SVG rendering of the scene contents. Parameters ---------- scene : :class:`CanvasScene` """ svg_buffer = QBuffer() gen = _QSvgGenerator() gen.setOutputDevice(svg_buffer) items_rect = scene.itemsBoundingRect().adjusted(-10, -10, 10, 10) if items_rect.isNull(): items_rect = QRectF(0, 0, 10, 10) width, height = items_rect.width(), items_rect.height() rect_ratio = float(width) / height # Keep a fixed aspect ratio. aspect_ratio = 1.618 if rect_ratio > aspect_ratio: height = int(height * rect_ratio / aspect_ratio) else: width = int(width * aspect_ratio / rect_ratio) target_rect = QRectF(0, 0, width, height) source_rect = QRectF(0, 0, width, height) source_rect.moveCenter(items_rect.center()) gen.setSize(target_rect.size().toSize()) gen.setViewBox(target_rect) painter = QPainter(gen) # Draw background. painter.setPen(Qt.NoPen) painter.setBrush(scene.palette().base()) painter.drawRect(target_rect) # Render the scene scene.render(painter, target_rect, source_rect) painter.end() buffer_str = bytes(svg_buffer.buffer()) return buffer_str.decode("utf-8")
def grab_svg(scene): """ Return a SVG rendering of the scene contents. Parameters ---------- scene : :class:`CanvasScene` """ from AnyQt.QtSvg import QSvgGenerator svg_buffer = QBuffer() gen = QSvgGenerator() gen.setOutputDevice(svg_buffer) items_rect = scene.itemsBoundingRect().adjusted(-10, -10, 10, 10) if items_rect.isNull(): items_rect = QRectF(0, 0, 10, 10) width, height = items_rect.width(), items_rect.height() rect_ratio = float(width) / height # Keep a fixed aspect ratio. aspect_ratio = 1.618 if rect_ratio > aspect_ratio: height = int(height * rect_ratio / aspect_ratio) else: width = int(width * aspect_ratio / rect_ratio) target_rect = QRectF(0, 0, width, height) source_rect = QRectF(0, 0, width, height) source_rect.moveCenter(items_rect.center()) gen.setSize(target_rect.size().toSize()) gen.setViewBox(target_rect) painter = QPainter(gen) # Draw background. painter.setBrush(QBrush(Qt.white)) painter.drawRect(target_rect) # Render the scene scene.render(painter, target_rect, source_rect) painter.end() buffer_str = bytes(svg_buffer.buffer()) return buffer_str.decode("utf-8")
def image_data(pm): # type: (QPixmap) -> str """ Render the contents of the pixmap as a data URL (RFC-2397) Parameters ---------- pm : QPixmap Returns ------- datauri : str """ pm = QPixmap(pm) device = QBuffer() assert device.open(QBuffer.ReadWrite) pm.save(device, b'png') device.close() data = bytes(device.data()) payload = base64.b64encode(data).decode("ascii") return "data:image/png;base64," + payload
def get_icon_html(icon: QIcon, size: QSize) -> str: """ Transform an icon to html <img> tag. """ if not size.isValid(): return "" if size.width() < 0 or size.height() < 0: size = QSize(16, 16) # just in case byte_array = QByteArray() buffer = QBuffer(byte_array) buffer.open(QIODevice.WriteOnly) pixmap = icon.pixmap(size) if pixmap.isNull(): return "" pixmap.save(buffer, "PNG") buffer.close() dpr = pixmap.devicePixelRatioF() if dpr != 1.0: size_ = pixmap.size() / dpr size_part = ' width="{}" height="{}"'.format( int(math.floor(size_.width())), int(math.floor(size_.height())) ) else: size_part = '' img_encoded = byte_array.toBase64().data().decode("utf-8") return '<img src="data:image/png;base64,{}"{}/>'.format(img_encoded, size_part)
def image_data(pm): # type: (QPixmap) -> str """ Render the contents of the pixmap as a data URL (RFC-2397) Parameters ---------- pm : QPixmap Returns ------- datauri : str """ pm = QPixmap(pm) device = QBuffer() assert device.open(QBuffer.ReadWrite) pm.save(device, b"png") device.close() data = bytes(device.data()) payload = base64.b64encode(data).decode("ascii") return "data:image/png;base64," + payload
def __init__(self, parent=None, *, mime=None, image=None): QDialog.__init__(self, parent) self.setupUi(self) self._backend = None self._backend_controls = {} self._label_anonymous = self.tr('Anonymous') self._label_select_login = self.tr('Select Login') self._available_backends = [] data = None file_name = None if image: self._share_type = Bi.Image data = image elif mime: if mime.hasImage(): self._share_type = Bi.Image data = mime.imageData() elif mime.hasUrls(): urls = mime.urls() if len(urls) == 1: file_path = os.path.realpath(urls[0].toLocalFile()) if not os.path.isfile(file_path): raise ValueError(self.tr('Directories can not be shared')) file_size = os.path.getsize(file_path) file_name = os.path.basename(file_path) if file_size > const.BIG_FILE_WARNING_SIZE: file_name = os.path.basename(file_path) nice_size = format_size(file_size) result = QMessageBox.warning(self, self.tr('Warning'), self.tr('File "{file_name}" {nice_size}.\n' 'Are you sure you want to continue?').format(**locals()), QMessageBox.Yes | QMessageBox.Abort) if result == QMessageBox.Abort: QTimer.singleShot(0, self.reject) return if file_has_extension(file_path, ('png', 'jpg', 'jpeg', 'bmp', 'gif')): image = QPixmap(file_path) else: image = None if not image or image.isNull(): data = read_text_from_file(file_path) if data: self._share_type = Bi.Text else: self._share_type = Bi.File data = file_path else: self._share_type = Bi.Image data = image else: raise ValueError(self.tr('Can not share more than one file')) elif mime.hasText(): self._share_type = Bi.Text data = mime.text() else: raise RuntimeError() if not data: raise ValueError(self.tr('There is no content in your clipboard.\nCopy something in order to share it.')) if self._share_type == Bi.Image: if not file_name: file_name = '{}-{}.png'.format('screenshot' if image else 'image', int(time())) if data.width() > self.image_preview.width() or data.height() > self.image_preview.height(): preview = data.scaled(self.image_preview.size(), Qt.KeepAspectRatio) else: preview = data if isinstance(preview, QImage): preview = QPixmap.fromImage(preview) self.image_preview.setPixmap(preview) self.preview_stack.setCurrentIndex(0) buf = QBuffer() data.save(buf, 'png', 100) data = buf.data().data() elif self._share_type == Bi.Text: if not file_name: file_name = 'file-{}.txt'.format(int(time())) self.text_preview.setPlainText(dedent_text_and_truncate(data, 128)) self.preview_stack.setCurrentIndex(1) elif self._share_type == Bi.File: if not file_name: file_name = 'file-{}.bin'.format(int(time())) self.text_preview.setPlainText(self.tr('No preview available')) self.preview_stack.setCurrentIndex(1) self._file_name = file_name self._data = data self.populate_backends() self.share.pressed.connect(self.share_item) self.add_login.pressed.connect(self.on_add_login) self.logout.pressed.connect(self.logout_selected) self.login_list.currentIndexChanged.connect(self.select_login) min_height = self.backend_selector.minimumSizeHint().height() if os.name == 'nt': # On windows tab widget and font are rather small min_height -= 5 for el in (self.add_login, self.login_list, self.logout, self.share): font = el.font() font.setPointSize(12) el.setFont(font) self.login_list.setFixedHeight(self.add_login.height() - 2) self.backend_selector.setFixedHeight(min_height) self.backend_selector.currentChanged.connect(self.select_backend) if self.backend_selector.height() < self.add_login.height(): # Move tab widget down based on size of controls on the right. Makes widgets below seem to belong to the # selected tab. self.backend_selector.move(0, self.add_login.height() - self.backend_selector.height()) self.resize(self.width(), 0) self.setWindowState((self.windowState() & ~Qt.WindowMinimized) | Qt.WindowActive) self.raise_() self.activateWindow()
def test(self): b = QBuffer() w = QPdfWriter(b) size = QPageSize(QSizeF(10, 10), QPageSize.Millimeter) _ = w.setPageSize(size) self.assertTrue(w.setPageSize(size))