Computer graphics in Python
Advanced vector graphics using Pycairo and Python
Martin McBride
2019 - 2020 Martin McBride
Table of Contents
Foreword
Who is this book for?
About the author
Keep in touch
Introduction to vector graphics
1.1 Pixel images
1.2 Size and resolution
1.3 Resizing pixel images
1.4 Drawing on pixel images
1.5 Vector graphics
1.6 Rendering
1.7 Typical uses
1.8 Benefits
1.9 Disadvantages
1.10 Common vector formats
About Pycairo
2.1 Cairo
2.2 Capabilities
2.3 Version
2.4 Installing Pycairo
2.5 Checking Pycairo version
Basic drawing operations
3.1 Creating an image with Pycairo
3.2 Coordinate system
3.3 Rectangles
3.4 Fill and stroke
3.5 Lines
3.6 Polygons
3.7 Open and closed shapes
3.8 Arcs
3.9 Circles
3.10 Bezier curves
3.11 Line styles
Paths and complex shapes
4.1 Paths
4.2 Sub-paths
4.3 Lines
4.4 Polygons
4.5 Arcs
4.6 Bezier curves
4.7 Function curves
4.8 Rectangle
Computer colour
5.1 RGB colour
5.2 Pycairo RGB colours
5.3 CSS named colours
5.4 Transparency
5.5 Transparency colour calculation
5.6 Transparent images
5.7 Greyscale images
5.8 Pixel colours
Transforms and state
6.1 User space and device space
6.2 Translation
6.3 Scaling
6.4 Rotation
6.5 Save and restore
6.6 Rotating about a point
6.7 Placing an ellipse
6.8 Correcting the effects of unequal scaling
6.9 Flipping
6.10 Current transform matrix
Working with text
7.1 Text is just shapes
7.2 How Pycairo handles text
7.3 Fonts
7.4 Font size
7.5 Font style
7.6 Text extents
7.7 Text extent examples
7.8 Text alignment
Gradients and image fills
8.1 Patterns
8.2 SolidPattern
8.3 Linear gradient
8.4 Linear gradients at different angles
8.5 Adding more stops
8.6 Extend options
8.7 Filling a stroke with a gradient
8.8 Filling text with a gradient
8.9 Radial gradients
8.10 Radial gradient with inner circle
8.11 Radial extend options
8.12 Loading an image into Pycairo
8.13 Using SurfacePattern with an image
8.14 SurfacePattern extend options
8.15 Using SurfacePattern with vectors
Clipping, masking and compositing
9.1 Clipping
9.2 Calling clip multiple times
9.3 Resetting the clip region
9.4 Clipping functions
9.5 Masking
9.6 Using an image as a mask
9.7 Compositing
9.8 OVER operator
9.9 Changing the drawing order
9.10 Masking operations
9.11 Artistic colour adjustments
9.12 Specific colour changes
Surfaces and output formats
10.1 Output formats
10.2 ImageSurface
10.3 SVGSurface
10.4 PDFSurface
10.5 PSSurface
10.6 RecordingSurface
10.7 ScriptSurface
10.8 TeeSurface
10.9 GUI surfaces
Integration with other libraries
11.1 How Pycairo stores image data
11.2 PIL (Pillow) integration
11.3 Numpy integration
Reference
12.1 Radians
Foreword
The Pycairo library is a Python graphics library based on the Cairo library. Cairo is written in C and has been ported to many other languages.
PyCairo is an efficient, fully featured, high quality graphics library, with similar drawing capabilities to other vector libraries and languages such as SVG, PDF, HTML canvas and Java graphics.
Typical use cases include: standalone Python scripts to create an image, chart, or diagram; server side image creation for the web (for example a graph of share prices that updates hourly); desktop applications, particularly those that involve interactive images or diagrams.
The power of Pycairo, with the expressiveness of Python, is also a great combination for making procedural images such as mathematical illustrations and generative art. It is also quite simple to generate image sequences that can be converted to video or animated gifs.
Who is this book for?
This book is primarily aimed at developers who have at least a small amount of Python experience, who are looking to use Python to create computer graphics for any application. The examples in the book use basic Python constructs, you dont need to be a Python guru to learn Pycairo. No prior knowledge of computer graphics is assumed, although if you have used other graphics systems you should still find this book useful as Pycairo has its own unique quirks and features.
About the author
Martin McBride is a software developer, specialising in computer graphics, sound, and mathematical programming. He has been writing code since the 1980s in a wide variety of languages from assembler through to C++, Java and Python. He writes for PythonInformer.com and is the author of Functional Programming in Python available on leanpub.com. He is interested in generative art and works on the generativepy open source project.
Keep in touch
If you have any comments or questions you can get in touch by any of the following methods:
Joining the Python Informer forum at Follow the Computer Graphics in Python board in the Books section.
Signing up for the Python Informer newsletter at pythoninformer.com
Following @pythoninformer on twitter.
Contacting me directly by email (info@axlesoft.com).
Introduction to vector graphics
There are two main ways to represent digital images - they can be stored as pixel images or vector images.
This book is about vector images, and more specifically how to use the Pycairo library to generate vector images. But we will start by looking at pixel images, because you cant fully understand one without the other.
1.1 Pixel images
A pixel image is an image that is made up of You can think of a pixel as being a tiny square area of the image. Each pixel is too small to see individually, but if you zoom right in you can see them, as this illustration shows:
The important thing about pixels is that each one represents a square of the image that is filled with a single colour. You cant have a pixel that is partly blue, partly red. Each of the squares in the zoomed image in completely filled with one colour. It is the combined effect of hundreds of tiny pixels that gives the illusion of a continuous image.
To store a pixel image, we simply need to store the colour value of each pixel, usually as an RGB (red, green, blue) value which typically occupies bytes per pixel (1 byte per colour). Many modern cameras create images with millions, or tens of millions, of pixels, so pixel images can take a very large amount of storage space. Most common image formats, such as JPEG, PNG and GIF, employ data compression to reduce the storage requirement.