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
This is possible in QGIS using the print composer. You'll need to both:
Remove the background color from the map item. This is done by unchecking the "background" option in the map item's properties. (The default is a white background)
Set the page itself to a transparent style. This is done through the composition properties tab.