Saturday, January 11, 2014

pngcanvas, a pure Python PNG library

By Vasudev Ram

I saw pngcanvas recently on Github.

pngcanvas is a minimalist pure Python library by Rui Carmo that lets you create PNG images from programs.

I only did a quick trial of it by modifying the test_pngcanvas.py program that comes with it - mainly stripping it down to the minimum needed to create a PNG file (since the program is more about testing the library than being an introductory example).

Here is my modified version, try_pngcanvas.py - some of the imports may not be needed:
#!/usr/bin/env python

from __future__ import (
    absolute_import, division, print_function, unicode_literals
)

import io
import logging

from pngcanvas import *

BUFSIZE = 8*1024  # Taken from filecmp module
HEIGHT = WIDTH = 512

logging.debug("Creating canvas: %d, %d", WIDTH, HEIGHT)
c = PNGCanvas(WIDTH, HEIGHT, color=(0xff, 0, 0, 0xff))
c.rectangle(0, 0, WIDTH - 1, HEIGHT - 1)

logging.debug("Generating gradient...")
c.vertical_gradient(1, 1, WIDTH - 2, HEIGHT - 2,
    (0xff, 0, 0, 0xff), (0x20, 0, 0xff, 0x80))

logging.debug("Drawing some lines...")
c.color = bytearray((0, 0, 0, 0xff))
c.line(0, 0, WIDTH - 1, HEIGHT - 1)
c.line(0, 0, WIDTH / 2, HEIGHT - 1)
c.line(0, 0, WIDTH - 1, HEIGHT / 2)

with open("try_pngcanvas.png", "wb") as png_fil:
    logging.debug("Writing to file...")
    png_fil.write(c.dump())


Here is the PNG image created by the program:


The program worked on the first try, no tweaking needed - a tribute to the author of pngcanvas.

Subjectively, it also seemed to run fast, though the image created is small.

Update: In my initial version, I had deleted the code to create a gradient. That was when the program ran fast. When I added the gradient code back, it ran significantly slower. Like, less than a second, vs. maybe 2 seconds. Not timed, just guessed. (It can be timed, of course, using various methods.) But considering that generating a gradient is a lot more work than just drawing lines, it seems not bad, at least relatively speaking.

I had also blogged some time ago about pypng, another such library:

pypng, pure Python module to encode/decode PNG

Read other Python posts on my blog.

- Vasudev Ram - Dancing Bison Enterprises


O'Reilly 50% Ebook Deal of the Day


Contact Page

2 comments:

Anonymous said...

You can time commands with `time ./python.py`, see `man time` for more information about it's usages.

Vasudev Ram said...

You might want to read posts more carefully before commenting on them:

1. There is no file called python.py in my post :)

2. I already said in the post that there are many methods to time the code.

The Unix time command is one, which I'm well aware of, as a long-time Unix guy (from before Linux was created, in fact). And there is the timeit module of Python:

http://docs.python.org/2/library/timeit.html

as well as other methods, both simpler and more complex, each with its pros and cons and features ...