def get_png_image( input_svg_file, newWidth = None, verify = True ): assert( os.path.basename( input_svg_file ).endswith( '.svg' ) or os.path.basename( input_svg_file ).endswith( '.svgz') ) assert( os.path.isfile( input_svg_file ) ) if os.path.basename( input_svg_file ).endswith( '.svgz' ): r = QSvgRenderer( QByteArray( gzip.open( input_svg_file, 'rb' ).read( ) ) ) files = { 'file' : gzip.open( input_svg_file, 'rb' ) } else: r = QSvgRenderer( input_svg_file ) files = { 'file' : open( input_svg_file, 'rb' ) } width = r.defaultSize().width() height = r.defaultSize().height() apiKey = get_cloudconvert_api_key( ) params = { 'apikey' : apiKey, 'input' : 'upload', 'inputformat' : 'svg', 'outputformat' : 'png', } if newWidth is not None: assert( isinstance( newWidth, int ) ) assert( newWidth > 10 ) newHeight = int( height * 1.0 * newWidth / width ) params['converteroptions[resize]'] = '%dx%d' % ( newWidth, newHeight ) # ## response = requests.post( "https://api.cloudconvert.com/convert", params = params, files = files, verify = verify ) if response.status_code != 200: raise ValueError("Error, could not upload and convert SVG file %s." % input_svg_file ) img = Image.open( StringIO( response.content ) ) return img
def requestPixmap(self, id, size, requestedSize): head = """<svg viewBox=\"0 -1 512 2\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"none\">\n""" s1 = self._callback(0) s2 = self._callback(1) beginpoly = "<polyline points=\"" def endpoly(color): return "\" style=\"fill:none;stroke:"+color+";stroke-width:0.03\"></polyline>" bytes = QByteArray(head + beginpoly + s1 + endpoly("green") + beginpoly + s2 + endpoly("red") + "</svg>") #self._iter = (self._iter + 1) % 256 #f = open('./waveforms/instantaneousWaveform%03d.svg' % self._iter, 'w') #f.write(head + beginpoly + s1 + endpoly("green") + beginpoly + s2 + endpoly("red") + "</svg>") #f.close() renderer = QSvgRenderer() worked = renderer.load(bytes) if not worked: print("SVG parse failed.") size = renderer.defaultSize() image = QPixmap(requestedSize) image.fill(QColor(0,0,0)) painter = QPainter(image) renderer.render(painter) return image
def requestPixmap(self, id, size, requestedSize): bytes = QByteArray(id) renderer = QSvgRenderer() renderer.load(bytes) size = renderer.defaultSize() image = QPixmap(requestedSize) painter = QPainter(image) renderer.render(painter) return image
def rasterize_svg(self, elem, width=0, height=0, format='PNG'): view_box = elem.get('viewBox', elem.get('viewbox', None)) sizes = None logger = self.oeb.logger if view_box is not None: try: box = [ float(x) for x in filter(None, re.split('[, ]', view_box)) ] sizes = [box[2] - box[0], box[3] - box[1]] except (TypeError, ValueError, IndexError): logger.warn( 'SVG image has invalid viewBox="%s", ignoring the viewBox' % view_box) else: for image in elem.xpath( 'descendant::*[local-name()="image" and ' '@height and contains(@height, "%")]'): logger.info( 'Found SVG image height in %, trying to convert...') try: h = float(image.get('height').replace('%', '')) / 100. image.set('height', str(h * sizes[1])) except: logger.exception( 'Failed to convert percentage height:', image.get('height')) data = QByteArray(xml2str(elem, with_tail=False)) svg = QSvgRenderer(data) size = svg.defaultSize() if size.width() == 100 and size.height() == 100 and sizes: size.setWidth(sizes[0]) size.setHeight(sizes[1]) if width or height: size.scale(width, height, Qt.KeepAspectRatio) logger.info('Rasterizing %r to %dx%d' % (elem, size.width(), size.height())) image = QImage(size, QImage.Format_ARGB32_Premultiplied) image.fill(QColor("white").rgb()) painter = QPainter(image) svg.render(painter) painter.end() array = QByteArray() buffer = QBuffer(array) buffer.open(QIODevice.WriteOnly) image.save(buffer, format) return str(array)
def rasterize_svg(self, elem, width=0, height=0, format='PNG'): view_box = elem.get('viewBox', elem.get('viewbox', None)) sizes = None logger = self.oeb.logger if view_box is not None: try: box = [float(x) for x in filter(None, re.split('[, ]', view_box))] sizes = [box[2]-box[0], box[3] - box[1]] except (TypeError, ValueError, IndexError): logger.warn('SVG image has invalid viewBox="%s", ignoring the viewBox' % view_box) else: for image in elem.xpath('descendant::*[local-name()="image" and ' '@height and contains(@height, "%")]'): logger.info('Found SVG image height in %, trying to convert...') try: h = float(image.get('height').replace('%', ''))/100. image.set('height', str(h*sizes[1])) except: logger.exception('Failed to convert percentage height:', image.get('height')) data = QByteArray(xml2str(elem, with_tail=False)) svg = QSvgRenderer(data) size = svg.defaultSize() if size.width() == 100 and size.height() == 100 and sizes: size.setWidth(sizes[0]) size.setHeight(sizes[1]) if width or height: size.scale(width, height, Qt.KeepAspectRatio) logger.info('Rasterizing %r to %dx%d' % (elem, size.width(), size.height())) image = QImage(size, QImage.Format_ARGB32_Premultiplied) image.fill(QColor("white").rgb()) painter = QPainter(image) svg.render(painter) painter.end() array = QByteArray() buffer = QBuffer(array) buffer.open(QIODevice.WriteOnly) image.save(buffer, format) return str(array)
def rasterize_external(self, elem, style, item, svgitem): width = style['width'] height = style['height'] width = (width / 72) * self.profile.dpi height = (height / 72) * self.profile.dpi data = QByteArray(str(svgitem)) svg = QSvgRenderer(data) size = svg.defaultSize() size.scale(width, height, Qt.KeepAspectRatio) key = (svgitem.href, size.width(), size.height()) if key in self.images: href = self.images[key] else: logger = self.oeb.logger logger.info('Rasterizing %r to %dx%d' % (svgitem.href, size.width(), size.height())) image = QImage(size, QImage.Format_ARGB32_Premultiplied) image.fill(QColor("white").rgb()) painter = QPainter(image) svg.render(painter) painter.end() array = QByteArray() buffer = QBuffer(array) buffer.open(QIODevice.WriteOnly) image.save(buffer, 'PNG') data = str(array) manifest = self.oeb.manifest href = os.path.splitext(svgitem.href)[0] + '.png' id, href = manifest.generate(svgitem.id, href) manifest.add(id, href, PNG_MIME, data=data) self.images[key] = href elem.tag = XHTML('img') for attr in elem.attrib: if attr not in KEEP_ATTRS: del elem.attrib[attr] elem.attrib['src'] = item.relhref(href) if elem.text: elem.attrib['alt'] = elem.text elem.text = None for child in elem: elem.remove(child)
def Printout(self): # Version utilisant QSvg # Fixme: l'alpha n'est pas bien rendu # (le fond des polygones est absent) # Le fond est bien présent après export avec matplotlib pourtant. printer = QPrinter(QPrinter.HighResolution) dialog = QPrintDialog(printer, self) dialog.setOption(QPrintDialog.PrintPageRange, False) dialog.setOption(QPrintDialog.PrintToFile, True) dialog.setOption(QPrintDialog.PrintShowPageSize, True) dialog.setWindowTitle("Imprimer le document") if (dialog.exec_() == QDialog.Accepted): painter = QPainter(printer) try: output = StringIO() self.onglet_actuel.canvas.exporter(output, format='svg') svg = QSvgRenderer(QByteArray(output.getvalue()), self) size = svg.defaultSize() size.scale(painter.viewport().size(), Qt.KeepAspectRatio) rect = QRectF(0, 0, size.width(), size.height()) svg.render(painter, rect) finally: painter.end()
def save_png (filename, sc, background = (255,255,255, 0) ) : """Create a png image from a scene :Parameters: - `filename` (str) - name to write the image - `sc` (SVGScene) - `background` (int, int, int, int) - background color as (R, G, B, alpha) 0-255 tuple """ qapp = QApplication.instance() if qapp is None : qapp = QApplication([]) r = QSvgRenderer(None) data = QByteArray(str(to_xml(sc) ) ) r.load(data) pix = QPixmap(r.defaultSize() ) pix.fill(QColor(*background) ) painter = QPainter(pix) r.render(painter) painter.end() pix.save(filename)
def save_png(filename, sc, background=(255, 255, 255, 0)): """Create a png image from a scene :Parameters: - `filename` (str) - name to write the image - `sc` (SVGScene) - `background` (int, int, int, int) - background color as (R, G, B, alpha) 0-255 tuple """ qapp = QApplication.instance() if qapp is None: qapp = QApplication([]) r = QSvgRenderer(None) data = QByteArray(str(to_xml(sc))) r.load(data) pix = QPixmap(r.defaultSize()) pix.fill(QColor(*background)) painter = QPainter(pix) r.render(painter) painter.end() pix.save(filename)
from PyQt4.QtCore import Qt from PyQt4.QtCore import QByteArray from PyQt4.QtCore import QBuffer from PyQt4.QtCore import QIODevice, QFile from PyQt4.QtGui import QColor from PyQt4.QtGui import QImage from PyQt4.QtGui import QPainter from PyQt4.QtSvg import QSvgRenderer from PyQt4.QtGui import QApplication import sys, os app = QApplication(sys.argv) svg = QSvgRenderer() current = os.getcwd() os.chdir(os.path.dirname(sys.argv[1])) svg.load(os.path.basename(sys.argv[1])) size = svg.defaultSize() size.scale(600, 800, Qt.KeepAspectRatio) image = QImage(size, QImage.Format_ARGB32_Premultiplied) image.fill(QColor("white").rgb()) painter = QPainter(image) svg.render(painter) painter.end() os.chdir(current) f = QFile(sys.argv[2]) f.open(QIODevice.WriteOnly) image.save(f, 'PNG')