The Python interface to VIPS is a very simple one generated automatically by SWIG from our C++ API, so it's a bit rough, not well tested, and not very Python-esque. It's also very large: the VIPS library is about a megabyte, the Python wrapping is about 3 MB. It works in the obvious way on OS X and Linux, on Windows it has been made to work but it's a more manual process.
VIPS has an operation database listing all operations and their arguments. A better way to make the bulk of the Python binding would be to intercept
VImage.something (...), look up
something in the database, convert the arguments and call the operation.
It'd be nice to add operator overloading as well. For example, nip2 allows arbitrary C-style expressions such as:
a = (0xff00 & (b << 8)) | (b & 0xff)
to swap the top and bottom bytes in a 16-bit image. No reason you couldn't do that in Python too. VIPS's chaining makes this sort of thing efficient.
std::vector<> becomes a simple list in Python. For example, the C++
VImage::lin (std::vector<float>a, std::vector<float> b)
which calculates out = in * a + b with separate values of a and b for each band of in, can be called as:
out = in.lin ([1,2,3], [4,5,6])
The binding also knows about
When you start up the VIPS binding it will look for any VIPS-related command-line arguments. So you can enter:
myprog.py fred.tif jim.jpg --vips-concurrency=2
You can also use the
IM_CONCURRENCY environment variable. Try
myprog.py --help to see all the supported arguments.
C++-style casts are wrapped as
convert_destination-type. For example, you can convert a mask (a matrix) to an image with:
im = mask.convert_VImage()