def saveImage(self, dirpath): img = FlowBoardPainter.renderImage(self._board, self._solver) filename = hex(abs(self._solver.stateHash()))[2:] + '.png' writer = QImageWriter(path.join(dirpath, filename)) writer.setFormat('png') if not writer.write(img): raise Exception(writer.errorString())
def image_to_data(img, compression_quality=95, fmt='JPEG', png_compression_level=9, jpeg_optimized=True, jpeg_progressive=False): ''' Serialize image to bytestring in the specified format. :param compression_quality: is for JPEG and goes from 0 to 100. 100 being lowest compression, highest image quality :param png_compression_level: is for PNG and goes from 0-9. 9 being highest compression. :param jpeg_optimized: Turns on the 'optimize' option for libjpeg which losslessly reduce file size :param jpeg_progressive: Turns on the 'progressive scan' option for libjpeg which allows JPEG images to be downloaded in streaming fashion ''' fmt = fmt.upper() ba = QByteArray() buf = QBuffer(ba) buf.open(QBuffer.WriteOnly) if fmt == 'GIF': w = QImageWriter(buf, b'PNG') w.setQuality(90) if not w.write(img): raise ValueError('Failed to export image as ' + fmt + ' with error: ' + w.errorString()) from PIL import Image im = Image.open(BytesIO(ba.data())) buf = BytesIO() im.save(buf, 'gif') return buf.getvalue() is_jpeg = fmt in ('JPG', 'JPEG') w = QImageWriter(buf, fmt.encode('ascii')) if is_jpeg: if img.hasAlphaChannel(): img = blend_image(img) # QImageWriter only gained the following options in Qt 5.5 if jpeg_optimized: w.setOptimizedWrite(True) if jpeg_progressive: w.setProgressiveScanWrite(True) w.setQuality(compression_quality) elif fmt == 'PNG': cl = min(9, max(0, png_compression_level)) w.setQuality(10 * (9 - cl)) if not w.write(img): raise ValueError('Failed to export image as ' + fmt + ' with error: ' + w.errorString()) return ba.data()
def image_to_data(img, compression_quality=95, fmt='JPEG', png_compression_level=9, jpeg_optimized=True, jpeg_progressive=False): ''' Serialize image to bytestring in the specified format. :param compression_quality: is for JPEG and goes from 0 to 100. 100 being lowest compression, highest image quality :param png_compression_level: is for PNG and goes from 0-9. 9 being highest compression. :param jpeg_optimized: Turns on the 'optimize' option for libjpeg which losslessly reduce file size :param jpeg_progressive: Turns on the 'progressive scan' option for libjpeg which allows JPEG images to be downloaded in streaming fashion ''' fmt = fmt.upper() ba = QByteArray() buf = QBuffer(ba) buf.open(QBuffer.WriteOnly) if fmt == 'GIF': w = QImageWriter(buf, b'PNG') w.setQuality(90) if not w.write(img): raise ValueError('Failed to export image as ' + fmt + ' with error: ' + w.errorString()) from PIL import Image im = Image.open(BytesIO(ba.data())) buf = BytesIO() im.save(buf, 'gif') return buf.getvalue() is_jpeg = fmt in ('JPG', 'JPEG') w = QImageWriter(buf, fmt.encode('ascii')) if is_jpeg: if img.hasAlphaChannel(): img = blend_image(img) # QImageWriter only gained the following options in Qt 5.5 if jpeg_optimized: w.setOptimizedWrite(True) if jpeg_progressive: w.setProgressiveScanWrite(True) w.setQuality(compression_quality) elif fmt == 'PNG': cl = min(9, max(0, png_compression_level)) w.setQuality(10 * (9-cl)) if not w.write(img): raise ValueError('Failed to export image as ' + fmt + ' with error: ' + w.errorString()) return ba.data()
def render(self, mapFileName, imageFileName): map = None renderer = None reader = MapReader() map = reader.readMap(mapFileName) if (not map): qWarning("Error while reading " + mapFileName + ":\n" + reader.errorString()) return 1 x = map.orientation() if x == Map.Orientation.Isometric: renderer = IsometricRenderer(map) elif x == Map.Orientation.Staggered: renderer = StaggeredRenderer(map) elif x == Map.Orientation.Hexagonal: renderer = HexagonalRenderer(map) else: renderer = OrthogonalRenderer(map) if (self.mTileSize > 0): xScale = self.mTileSize / map.tileWidth() yScale = self.mTileSize / map.tileHeight() else: xScale = yScale = self.mScale mapSize = renderer.mapSize() margins = map.computeLayerOffsetMargins() mapSize.setWidth(mapSize.width() + margins.left() + margins.right()) mapSize.setHeight(mapSize.height() + margins.top() + margins.bottom()) mapSize.setWidth(mapSize.width() * xScale) mapSize.setHeight(mapSize.height() * yScale) image = QImage(mapSize, QImage.Format_ARGB32) image.fill(Qt.transparent) painter = QPainter(image) if (xScale != 1.0 or yScale != 1.0): if (self.mUseAntiAliasing): painter.setRenderHints(QPainter.SmoothPixmapTransform | QPainter.Antialiasing) painter.setTransform(QTransform.fromScale(xScale, yScale)) painter.translate(margins.left(), margins.top()) # Perform a similar rendering than found in exportasimagedialog.py for layer in map.layers(): if (not self.shouldDrawLayer(layer)): continue painter.setOpacity(layer.opacity()) painter.translate(layer.offset()) tileLayer = layer imageLayer = layer tp = type(layer) if tp == TileLayer: renderer.drawTileLayer(painter, tileLayer) elif tp == ImageLayer: renderer.drawImageLayer(painter, imageLayer) painter.translate(-layer.offset()) painter.end() # Save image imageWriter = QImageWriter(imageFileName) if (not imageWriter.write(image)): qWarning("Error while writing " + imageFileName + ": " + imageWriter.errorString()) return 1 return 0
def render(self, mapFileName, imageFileName): map = None renderer = None reader = MapReader() map = reader.readMap(mapFileName) if (not map): qWarning("Error while reading " + mapFileName + ":\n" + reader.errorString()) return 1 x = map.orientation() if x==Map.Orientation.Isometric: renderer = IsometricRenderer(map) elif x==Map.Orientation.Staggered: renderer = StaggeredRenderer(map) elif x==Map.Orientation.Hexagonal: renderer = HexagonalRenderer(map) else: renderer = OrthogonalRenderer(map) if (self.mTileSize > 0): xScale = self.mTileSize / map.tileWidth() yScale = self.mTileSize / map.tileHeight() else: xScale = yScale = self.mScale mapSize = renderer.mapSize() margins = map.computeLayerOffsetMargins() mapSize.setWidth(mapSize.width() + margins.left() + margins.right()) mapSize.setHeight(mapSize.height() + margins.top() + margins.bottom()) mapSize.setWidth(mapSize.width()*xScale) mapSize.setHeight(mapSize.height()*yScale) image = QImage(mapSize, QImage.Format_ARGB32) image.fill(Qt.transparent) painter = QPainter(image) if (xScale != 1.0 or yScale != 1.0): if (self.mUseAntiAliasing): painter.setRenderHints(QPainter.SmoothPixmapTransform | QPainter.Antialiasing) painter.setTransform(QTransform.fromScale(xScale, yScale)) painter.translate(margins.left(), margins.top()) # Perform a similar rendering than found in exportasimagedialog.py for layer in map.layers(): if (not self.shouldDrawLayer(layer)): continue painter.setOpacity(layer.opacity()) painter.translate(layer.offset()) tileLayer = layer imageLayer = layer tp = type(layer) if tp == TileLayer: renderer.drawTileLayer(painter, tileLayer) elif tp == ImageLayer: renderer.drawImageLayer(painter, imageLayer) painter.translate(-layer.offset()) painter.end() # Save image imageWriter = QImageWriter(imageFileName) if (not imageWriter.write(image)): qWarning("Error while writing " + imageFileName + ": " + imageWriter.errorString()) return 1 return 0