コード例 #1
0
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
コード例 #2
0
ファイル: convertImage.py プロジェクト: tanimislam/nprstuff
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
コード例 #3
0
ファイル: WaveFactory.py プロジェクト: iSFX-Team/iSFX
 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
コード例 #4
0
ファイル: SvgFactory.py プロジェクト: iSFX-Team/iSFX
 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
コード例 #5
0
ファイル: rasterize.py プロジェクト: siebert/calibre
    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)
コード例 #6
0
ファイル: rasterize.py プロジェクト: Hainish/calibre
    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)
コード例 #7
0
ファイル: rasterize.py プロジェクト: 089git/calibre
 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)
コード例 #8
0
ファイル: rasterize.py プロジェクト: sss/calibre
 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)
コード例 #9
0
 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()
コード例 #10
0
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)
コード例 #11
0
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)
コード例 #12
0
ファイル: qtraster.py プロジェクト: devernay/xkcd-kindle
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')