In case someone needs to do the same as me the following code (blocks of code adapted from Pete)
import java.awt.Color
import java.awt.image.BufferedImage
import java.awt.image.IndexColorModel
import javax.imageio.ImageIO
import qupath.lib.regions.RegionRequest
import qupath.lib.scripting.QPEx
import static qupath.lib.roi.PathROIToolsAwt.getShape
def server = imageData.getServer()
def path = server.getPath()
def pathOutput = QPEx.buildFilePath(QPEx.PROJECT_BASE_DIR, 'exported_tiles')
QPEx.mkdirs(pathOutput)
def write_image(PathAnnotationObject anno, downsample,server, path, pathOutput, writeOvrl){
def request = RegionRequest.createInstance(path, downsample, anno.getROI())
def img = server.readBufferedImage(request)
ImageIO.write(img, 'PNG', new File(pathOutput, anno.getName()+"_tile.png"))
if (writeOvrl) {
def imgOverlay = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_4BYTE_ABGR)
def g2d = imgOverlay.createGraphics()
g2d.translate(-request.getX()/downsample, -request.getY()/downsample)
g2d.scale(1.0/downsample, 1.0/downsample)
def shapes = []
def pClass = []
anno.getChildObjects().each{
shapes.add(getShape(it.getROI()))
pClass.add(it.getPathClass().getName())
}
i = 0
shapes.each{shape->
if(pClass[i]=="Negative"){
g2d.setColor(new java.awt.Color(0,0,255,127))
}else if(pClass[i]=="Positive"){
g2d.setColor(new java.awt.Color(255,0,0,127))
}else{
g2d.setColor(new java.awt.Color(255,255,255,127))
}
g2d.fill(shape)
i++
}
g2d.setColor(new java.awt.Color(0, 0, 255, 255))
def nucleus = []
anno.getChildObjects().each{
nucleus.add(getShape(it.getNucleusROI()))
}
i = 0
nucleus.each{nuc->
if(pClass[i]=="Negative"){
g2d.setColor(new java.awt.Color(0,0,255,255))
}else if(pClass[i]=="Positive"){
g2d.setColor(new java.awt.Color(255,0,0,255))
}else{
g2d.setColor(new java.awt.Color(255,255,255,255))
}
g2d.fill(nuc)
i++
}
g2d.dispose()
ImageIO.write(imgOverlay, 'PNG', new File(pathOutput, anno.getName()+'_overlay.png'))
}
}