I wrote an image exporter for Fusion Charts while working for YouGov/Polimetrix, and someone recently asked if they could use it as well.
You’ll have to alter it a bit because it was written for a custom CherryPy-based framework. It works with Fusion Charts 3.1 (and 3.0 with trivial changes to the POST variables being read).
The only dependency is on PIL:
from StringIO import StringIO
import Image
import ImageColor
import cherrypy
def str2color(val):
return ImageColor.getrgb('#'+val.ljust(6, '0'))
class SaveImagePage(LoggedInPage): # Custom framework specific -- remove
def control(self, page, meta_width='', meta_height='', meta_bgColor='ffffff', stream=''):
# Convert 3.1 parameters to 3.0 style as they made more sense
width = meta_width
height = meta_height
bgcolor = meta_bgColor
data = stream
# Split the data into rows using ; as the spearator
rows = data.split(';')
# Create image
bgcolor = str2color(bgcolor)
im = Image.new('RGB', (int(width), int(height)), bgcolor)
imcore = im.load()
for y, row in enumerate(rows):
x = 0
# Split row into pixels
pixels = row.split(',')
for pixel in pixels:
# Split pixel into color and repeat value
color, repeat = pixel.split('_')
repeat = int(repeat)
if color == '':
# Empty color == background color
color = bgcolor
else:
# Pad color to 6 characters
color = str2color(color)
while repeat:
# Add pixels 1-at-a-time since putdata() doesn't work
imcore[x, y] = color
x += 1
repeat -= 1
# Save image into file like object
imstr = StringIO()
im.save(imstr, 'PNG', quality=100)
# Set HTTP headers -- CherryPy specific code
cherrypy.response.headers['content-type'] = 'image/png'
cherrypy.response.headers['content-disposition'] = \
'attachment; filename="Chart.png'
# Return image as string, your framework may be different
return imstr.getvalue()