def __init__(self, image_file=None, default_wh=[1024.0, 1024.0], progress_handler = None): self.clear() self.image = None if progress_handler: self.ph = progress_handler else: self.ph = lambda i: None self.ph._message = '' self.ph._maxval = 0 if image_file and os.path.exists(image_file): # image tracing shall consist of 256 index colors ranked by luma img = QImage(image_file) if not img.isGrayscale() and QMessageBox("Image is not in grayscale", "Convert RGB image to grayscale?", QMessageBox.Question, QMessageBox.Yes, QMessageBox.No, 0).exec_() == QMessageBox.Yes: self.ph._message = 'Converting image to grayscale' self.ph._maxval = img.height() for y in range(img.height()): for x in range(img.width()): lightness = qGray(img.pixel(x, y)) img.setPixel(x, y, (lightness<<16) + (lightness<<8) + lightness) self.ph(y) colortable = [QColor(i, i, i).rgb() for i in xrange(256)] self.image = img.convertToFormat(QImage.Format_Indexed8, colortable) w, h = float(self.image.width()), float(self.image.height()) self.dpi = img.dotsPerMeterX() / 1000.0 * 25.4 else: w, h = default_wh self.dpi = 96.0 self.wh = [w, h] self.x1, self.y1, self.x2, self.y2 = [i/max(w, h) for i in [-w, -h, w, h]] self.dx = self.x2 - self.x1 self.dy = self.y2 - self.y1 # Resolution field in SVG units per pixel self.scale = self.dx / w
def getLegendGraphic(self, params): qgsLayer = self.layerRegistry.mapLayer(params.get('layer')) boxSpace = 1 layerSpace = 2 # layerTitleSpace = 3 symbolSpace = 2 iconLabelSpace = 2 symbolWidth = 5 symbolHeight = 3 drawLegendLabel = True rootGroup = QgsLayerTreeGroup() rootGroup.addLayer(qgsLayer) # layer = QgsLayerTreeLayer(qgsLayer) # if qgsLayer.title(): # layer.setLayerName(qgsLayer.title()) legendModel = QgsLayerTreeModel(rootGroup) rootChildren = rootGroup.children() img_tmp = QImage(QSize(1, 1), QImage.Format_ARGB32_Premultiplied) dpm = 1 / 0.00028 img_tmp.setDotsPerMeterX(dpm) img_tmp.setDotsPerMeterY(dpm) dpmm = img_tmp.dotsPerMeterX() / 1000.0 del img_tmp legendSettings = QgsLegendSettings() legendSettings.setTitle('') legendSettings.setBoxSpace(boxSpace) legendSettings.rstyle(QgsComposerLegendStyle.Subgroup).setMargin(QgsComposerLegendStyle.Top, layerSpace) legendSettings.rstyle(QgsComposerLegendStyle.Symbol).setMargin(QgsComposerLegendStyle.Top, symbolSpace) legendSettings.rstyle(QgsComposerLegendStyle.SymbolLabel).setMargin(QgsComposerLegendStyle.Left, iconLabelSpace) legendSettings.setSymbolSize(QSizeF(symbolWidth, symbolHeight)) # legendSettings.rstyle(QgsComposerLegendStyle.Subgroup).setFont(layerFont) # legendSettings.rstyle(QgsComposerLegendStyle.SymbolLabel).setFont(itemFont) # // TODO: not available: layer font color # legendSettings.setFontColor( itemFontColor ); # for node in rootChildren: # if (QgsLayerTree.isLayer(node)): # QgsLegendRenderer.setNodeLegendStyle(node, QgsComposerLegendStyle.Subgroup) # # rule item titles # # if ( !mDrawLegendItemLabel ) # # for legendNode in legendModel.layerLegendNodes(nodeLayer): # # legendNode.setUserLabel(' ') # # } legendRenderer = QgsLegendRenderer(legendModel, legendSettings) minSize = legendRenderer.minimumSize() s = QSize(minSize.width() * dpmm, minSize.height() * dpmm) img = QImage(s, QImage.Format_ARGB32_Premultiplied) # fill in the background color = QColor(0, 0, 0, 0) img.fill(color) p = QPainter() p.begin(img) p.setRenderHint(QPainter.Antialiasing, True) p.scale(dpmm, dpmm) legendRenderer.drawLegend(p) map_buffer = QBuffer() map_buffer.open(QIODevice.ReadWrite) img.save(map_buffer, 'PNG') # clean up map_buffer.close() p.end() # self.layerRegistry.removeAllMapLayers() return map_buffer.data()