diff --git a/TODO b/TODO index 310984d5..9f749adf 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,3 @@ -- update python section in manual - - try: $ cd vips-x.x.x/libvips @@ -13,6 +11,24 @@ - python fitsload has both "access" and "sequential" as kwargs, is this right? why do we need both? + try: + + $ vips fitsload + load a FITS image + usage: + fitsload filename out + where: + filename - Filename to load from, input gchararray + out - Output image, output VipsImage + optional arguments: + flags - Flags for this file, output VipsForeignFlags + disc - Open to disc, input gboolean + access - Required access pattern for this file, input VipsAccess + + seq is not there ... do we need to hide deprecated? + + check cplusplus as well + - test other arg types input int works diff --git a/doc/reference/using-python.xml b/doc/reference/using-python.xml index 2b658ba0..7f8b6e8b 100644 --- a/doc/reference/using-python.xml +++ b/doc/reference/using-python.xml @@ -15,8 +15,8 @@ How to use the VIPS library from Python - - Using VIPS from Python + + Introduction VIPS comes with a convenient, high-level Python API based on gobject-introspection. As long as you can get GOI @@ -28,8 +28,7 @@ on your platform. - -VIPS from Python example + #!/usr/bin/python @@ -48,40 +47,34 @@ im = im.conv(mask) im.write_to_file(sys.argv[2]) - - - Reading the example, the first line loads the input file. You can append + Reading this example, the first line loads the input file. You can append load options to the argument list as keyword arguments, for example: im = Vips.Image.new_from_file(sys.argv[1], access = Vips.Access.SEQUENTIAL) - See the various loaders for a list of the available options for each - file format. The C - equivalent to this function, vips_image_new_from_file(), has more - extensive documentation. + See the various loaders for a list of the available options + for each file format. The C equivalent to this function, + vips_image_new_from_file(), has more extensive documentation. Try + help(Vips.Image) to see a list of all the image + constructors --- you can load from memory, or create from an array, + for example. - There are - several other constructors: you can load a formatted image (for example, - a JPEG format image) from a string with .new_from_buffer(). + The next line crops 100 pixels off every edge. Try + help(im.extract_area) and the C API docs for + vips_extract_area() for details. You can use .crop() as a + synonym, if you like. im.width gets the image width in + pixels, see help(Vips.Image) and vips_image_get_width() + and friends for a list of the other getters. - The next line crops 100 pixels off every edge. See the docs for the C - function vips_extract_area() for details of the parameters. You can use - .crop() as a synonym, if you like. - im.width gets the image width in pixels, see - vips_image_get_width() and friends for a list of the other getters. - - - - The similarity line shrinks by 10%, see the docs for the C - function vips_similarity() for details. By default it uses bilinear - interpolation, use interpolate to pick another + The similarity line shrinks by 10%. By default it uses + bilinear interpolation, use interpolate to pick another interpolator, for example: @@ -124,139 +117,134 @@ from gi.repository import Vips from your code, and they will call into libvips for you. C functions become Python functions in an obvious way: vips_operation_new(), for example, the constructor for the class #VipsOperation, becomes - Vips.Operation.new(). + Vips.Operation.new(). See the C API docs for details. Using libvips like this is possible, but a bit painful. To make the API - seem more pythonesque, vips includes a set of overrides which wrap up - the bare functions created by gobject-introspection in a nicer package. - These overrides do the following things: + seem more pythonesque, vips includes a set of overrides which form a + layer over the bare functions created by gobject-introspection. + + - + + Automatic wrapping + + The overrides intercept member lookup + on the Vips.Image class and look for vips operations + with that name. So the vips operation "add", which appears in the + C API as vips_add(), appears in Python as + image.add(). + - - Automatic wrapping of vips operations + + The first input image argument becomes the self + argument. If there are no input image arguments, the operation + appears as a class member. Optional input arguments become + keyword arguments. The result is a list of all the output + arguments, or a single output if there is only one. + - - It intercepts member lookup - on the Vips.Image class and looks for vips operations - with that name. So the vips operation "add", which appears in the - C API as vips_add(), appears in Python as - Vips.Image.add. - - - - - Add docstrings - - - Try help(Vips.Image), or something like: - - -image = Vips.Image.new_from_file("x.jpg") -help(image.add) - - - For any operator it'll list the required and optional input and - output arguments, using all the rules listed below. This plus the - C API docs should be enough to answer most questions. IDEs should - display the help text automatically as you work. - - - - - Automatic wrapping of operation arguments - - - The first input image argument becomes the self - argument. If there are no input image arguments, the operation - appears as a class member. Optional input arguments become - keyword arguments. The result is a list of all the output - arguments, or a single output if there is only one. - - - - Optional output arguments are enabled with a boolean keyword - argument of that name. For example, "min" (the operation which - appears in the C API as vips_min()), can be called like this: + + Optional output arguments are enabled with a boolean keyword + argument of that name. For example, "min" (the operation which + appears in the C API as vips_min()), can be called like this: min_value = im.min() - and min_value will be a floating point value giving - the minimum value in the image. "min" can also find the position - of the minimum value with the x and y - optional output arguments. Call it like this: + and min_value will be a floating point value giving + the minimum value in the image. "min" can also find the position + of the minimum value with the x and y + optional output arguments. Call it like this: min_value, x_pos, y_pos = im.min(x = True, y = True) - Although in this case, the .minpos() convenience - function would be simpler. - - + Although in this case, the .minpos() convenience + function would be simpler. + - - Automatic type conversion - - The override looks at the type of - argument required by the operation and converts the value you - supply, when it can. For example, "linear" takes a - #VipsArrayDouble as an argument for the constant to use for - multiplication. You can supply this value as an integer, a float, - or some kind of compound object and it will be converted for you. - + + Because operations are member functions and return the result image, + you can chain them. For example, you can write: - - It does a couple of more ambitious conversions. It will - automatically convert to and from the various vips types, - like #VipsBlob and #VipsArrayImage. For example, you can read the - ICC profile out of an image like this: + +result_image = image.sin().pow(2) + + + to calculate the square of the sine for each pixel. There is also a + full set of arithmetic operator overloads, see below. + + + + VIPS types are also automatically wrapped. The override looks + at the type of argument required by the operation and converts + the value you supply, when it can. For example, "linear" takes a + #VipsArrayDouble as an argument for the set of constants to use for + multiplication. You can supply this value as an integer, a float, + or some kind of compound object and it will be converted for you. + You can write: + + +result_image = image.linear(1, 3) +result_image = image.linear(12.4, 13.9) +result_image = image.linear([1, 2, 3], [4, 5, 6]) +result_image = image.linear(1, [4, 5, 6]) + + + And so on. A set of overloads are defined for .linear(), + see below. + + + + It does a couple of more ambitious conversions. It will + automatically convert to and from the various vips types, + like #VipsBlob and #VipsArrayImage. For example, you can read the + ICC profile out of an image like this: profile = im.get_value("icc-profile-data") - and profile will be a string. - + and profile will be a string. + - - If an operation - takes several input images, you can use a constant for all but - one of them and the wrapper will make a constant image for you. - For example, .ifthenelse() uses a condition image to - pick pixels between a then and an else image: + + If an operation takes several input images, you can use a constant + for all but one of them and the wrapper will expand the constant + to an image for you. For example, .ifthenelse() uses + a condition image to pick pixels between a then and an else image: result_image = condition_image.ifthenelse(then_image, else_image) - You can use a constant instead of either the then or the else - parts, and it will be expanded to an image for you. If you use a - constant for both then and else, it will be expanded to match the - condition image. For example: + You can use a constant instead of either the then or the else + parts, and it will be expanded to an image for you. If you use a + constant for both then and else, it will be expanded to match the + condition image. For example: result_image = condition_image.ifthenelse([0, 255, 0], [255, 0, 0]) - Will make an image where true pixels are green and false pixels - are red. - + Will make an image where true pixels are green and false pixels + are red. + - - This is useful for .bandjoin(), the thing to join - two, or a set of images up bandwise. You can write: + + This is useful for .bandjoin(), the thing to join + two or more images up bandwise. You can write: rgba = rgb.bandjoin(255) - to add a constant 255 band to an image, perhaps to add an alpha - channel. Of course you can also write: + to add a constant 255 band to an image, perhaps to add an alpha + channel. Of course you can also write: result_image = image1.bandjoin(image2) @@ -265,70 +253,89 @@ result_image = Vips.Image.bandjoin([image1, image2, image3]) result_image = image1.bandjoin([image2, 255]) - and so on. - - + and so on. + + - - Exceptions - - - The wrapper spots errors from vips operations and raises the - Vips.Error exception. You can catch it in the - usual way. The .detail member gives the detailed - error message. - - + + Automatic docstrings + + Try help(Vips) for everything, + help(Vips.Image) for something slightly more digestible, or + something like help(Vips.Image.black) for help on a + specific class member. + - - Overloads + + You can't get help on dynamically bound member functions like + .add() this way. Instead, make an image and get help + from that, for example: - - The wrapper defines the usual set of arithmetic, boolean and - relation overloads on - image. You can mix images, constants and lists of - constants (almost) freely. - - + +image = Vips.Image.new_from_file("x.jpg") +help(image.add) + - - Expansions + And you'll get a summary of the operator's behaviour and how the + arguments are represented in Python. Use the C API docs for more detail. + + - - Some vips operators take an enum to select an action, for example - .math() can be used to calculate sine of every pixel - like this: + + Exceptions + + The wrapper spots errors from vips operations and raises the + Vips.Error exception. You can catch it in the + usual way. The .detail member gives the detailed + error message. + + + + + Overloads + + The wrapper defines the usual set of arithmetic, boolean and + relational overloads on + image. You can mix images, constants and lists of + constants (almost) freely. For example, you can write: + + +result_image = ((image * [1, 2, 3]).abs() < 128) | 4 + + + + + + Expansions + + Some vips operators take an enum to select an action, for example + .math() can be used to calculate sine of every pixel + like this: result_image = image.math(Vips.OperationMath.SIN) - This is annoying, so the wrapper expands all these enums into - separate members named after the enum. So you can write: + This is annoying, so the wrapper expands all these enums into + separate members named after the enum. So you can write: result_image = image.sin() - See help(Vips.Image) for a list. - - - - - Utility functions - - - The wrapper defines a few extra useful utility functions: - .get_value(), .set_value() - .bandsplit(), .maxpos() - .minpos(). - Again, see help(Vips.Image) for a list. - - - - + See help(Vips.Image) for a list. + + + + + Convenience functions + + The wrapper defines a few extra useful utility functions: + .get_value(), .set_value() + .bandsplit(), .maxpos() + .minpos(). + Again, see help(Vips.Image) for a list. -