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
I found a solution to my problem:
In the transparency tab use the mouse selection tool to add a value from the screen by interactively clicking on a pixel. This will automatically add a new line in the table to the left showing the band characteristics of this pixel. Clicking on apply will then set to transparent all the pixels in the raster with the same pixel value.