You can set the page background to transparent by creating a transparent symbol and setting the page background to use that symbol:
transparent_fill = QgsFillSymbolV2.createSimple({ 'outline_style': 'no', 'style': 'no'})
c.setPageStyleSymbol( transparent_fill )
There's also a few other things wrong with your script:
First,
mapRenderer = iface.mapCanvas().mapRenderer()
c = QgsComposition(mapRenderer)
mapRenderer is deprecated and will be removed soon. The replacement is QgsMapSettings:
map_settings = iface.mapCanvas().mapSettings()
c = QgsComposition(map_settings)
Next,
# get all items and disable the backgrounds
itemList = c.items()
c.removeItem(itemList[2])
c.removeItem(itemList[2])
itemList[2].setBackgroundEnabled(False)
itemList[3].setBackgroundEnabled(False)
# add them to the composition
c.addItem(itemList[2])
c.addItem(itemList[3])
c.refreshItems()
c.refreshDataDefinedProperty(QgsComposerObject.AllProperties)
Most of this isn't required. Just set the map item to have no background after you've created it:
composerMap = QgsComposerMap(c, x ,y, w, h)
composerMap.setBackgroundEnabled(False)
Lastly:
# image = QImage(QSize(width, height), QImage.Format_ARGB32)
image = QImage(QSize(width, height), QImage.Format_ARGB32_Premultiplied)
image.setDotsPerMeterX(dpmm * 1000)
image.setDotsPerMeterY(dpmm * 1000)
#image.fill(0)
Should be:
image = QImage(QSize(width, height), QImage.Format_ARGB32)
image.setDotsPerMeterX(dpmm * 1000)
image.setDotsPerMeterY(dpmm * 1000)
image.fill( Qt.transparent )
Don't use a premultiplied image, and you MUST initialise the image with a color. In this case we'll initialise it by filling it with a transparent color.
Here's a working (and cleaned up) version:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
# PARAMETERS
mainPath = '/path/to/folder/'
filename = 'filename'
imageType = "png"
imageWidth_mm = 400
imageHeight_mm = 160
dpi = 300
map_settings = iface.mapCanvas().mapSettings()
c = QgsComposition(map_settings)
c.setPaperSize(400, 160)
c.setPrintResolution(dpi)
#set page background to transparent
transparent_fill =QgsFillSymbolV2.createSimple({ 'outline_style': 'no', 'style': 'no'})
c.setPageStyleSymbol( transparent_fill )
x, y = 0, 0
w, h = c.paperWidth(), c.paperHeight()
composerMap = QgsComposerMap(c, x ,y, w, h)
composerMap.setBackgroundEnabled(False)
c.addItem(composerMap)
dpmm = dpi / 25.4
width = int(dpmm * c.paperWidth())
height = int(dpmm * c.paperHeight())
# create output image and initialize it
image = QImage(QSize(width, height), QImage.Format_ARGB32)
image.setDotsPerMeterX(dpmm * 1000)
image.setDotsPerMeterY(dpmm * 1000)
image.fill(Qt.transparent)
imagePainter = QPainter(image)
c.setPlotStyle(QgsComposition.Print)
c.renderPage( imagePainter, 0 )
imagePainter.end()
imageFilename = mainPath + filename + '.' + imageType
image.save(imageFilename, imageType)
print 'image saved'
print 'done'
Best Answer
ArcGIS Pro will share/export to PNG including transparency.
If you have set a background colour, there will be no transparency, but if there is no background and no basemap then it will export to PNG with a transparent background.
The following image was exported from ArcGIS Pro to PNG (Color Mode: 32-bit with Alpha) and then added to ArcMap
I then set the background colour in ArcMap to blue, behind the same PNG image
Which shows that the PNG was exported from ArcGIS Pro with transparency.
This is only the case in the Map itself. ArcGIS Pro does not currently support exporting with transparency in the Layout.