Scripted drawing with ImageMagick
Silhouette
ImageMagick can do more than just edit existing images. The free software can even be scripted to create simple drawings.
Although you would normally use a bona fide graphics program for drawing and painting, there are definitely situations in which you need to draw regular shapes in an image repeatedly at fixed intervals – as shown here, for example, when creating the silhouette of an imaginary city (Figure 1). This does not require an expensive graphics program with a sophisticated macro language. Using the free and open source ImageMagick software package at the command line is more than up to this task.

To compose more extensive images, you will need the support of a scripting language such as Bash, which uses loops and other control structures to repeatedly insert image content into the graphic. ImageMagick can be found in the package sources of most Linux distributions, but it can also be downloaded for installation from the download section of the project page [1].
Painting by Commands
After completing the install, type
magick logo: logo.gif
at the command line. ImageMagick will create the logo.gif
file in the current directory. It shows the magician seen in the upper right corner of Figure 1. You can easily check this by opening the file in a suitable image viewer. Image names ending with a colon are internal test images in ImageMagick. You can create more test images with the rose:
and wizard:
[2] options.
To demonstrate that you can actually draw at the command line with ImageMagick, see the command in Listing 1.
Listing 1
Rectangle
What this does is to first set the image size with the -size
parameter. Then xc:skyblue
paints the background of the image sky blue. Historically, xc:
stands for "X Constant Image," but today it stands for canvas. The instruction expects a color name from the X Window System palette, which ImageMagick adopted [3].
You can also specify a gradient, for example, by typing gradient:blue
instead of xc:skyblue
. The built-in gradient image generator would then create a blue gradient background image for you. For an idea of the possibilities, check out the ImageMagick documentation. The manual goes into the details of plasma canvases [4] and gradients [5], for example.
The -fill
parameter is followed by the definition of the drawing color for the subsequent drawing command, which is introduced by -draw
and quoted. The last parameter is the name of the image file to be created.
The resulting image is a red rectangle, rounded at the corners, on a light blue background. You create more complex drawings by stringing together several drawing commands (Listing 2, lines 1 to 3).
Listing 2
Multiple Elements
Three-Box Car
The result of the first call from Listing 2 is shown in Figure 2: a very simplified image of a notchback based on the three-box principle. By passing in the drawing command from line 4 of Listing 2, you can improve the boxy shape a little. The command angles the passenger compartment a bit at the front.
The auto.png
file I just created provides the basis for subsequent beveling of the passenger compartment. The command writes the results to the auto-bevel.png
file. If you want to avoid constantly recreating files, use the command from the last line of Listing 2 instead. This modifies the auto.png
file directly.
Although both methods have advantages for your first steps in getting to know ImageMagick, they have one decisive disadvantage. They are both comparatively slow. As you can imagine, drawing an entire skyscraper this way is complicated. You would have to string together several draw
commands, and a separate call would be required for each individual window. And you would have to manually calculate the positions of the windows up front.
Faster with Scripts
The slowness in drawing a skyscraper can remedied by using a script that determines the image size based on the information it receives about the desired number of floors and windows per floor. It also defines a color gradient for the background and saves the image. It then calculates all the drawing instructions for the actual building and the windows and doors and collects them in an XML-formatted Magick Scripting Language (MSL) file.
Finally, the script uses a conjure
statement to process the mess of drawing commands. This greatly improves speed over incrementally developing the image using individual mogrify
statements. Listing 3 shows an MSL file for a small two-story house with a foundation, five windows, and a front door.
Listing 3
miniHouse.msl
You call the buildHouse
shell script, on which this workshop is based, using the syntax in Listing 4. Its contents are taken unchanged from Listing 5. For the sake of simplicity, the script does not perform an extensive check of the parameters you pass in. In addition, only positioning parameters are used. The call sequence in the command line determines the assignment in the script for this. If you want to improve this script, you need to look into the shell's error checking options and also consider using getopts
in the script.
Listing 4
Sample Syntax
Listing 5
buildHouse
When calling the script, you need to specify the file name without a file extension. The .msl
and .png
extensions are added automatically by the code. If you leave the option for the number of floors and the number of windows per floor empty, the script will use default values. The file name, on the other hand, must always be specified, otherwise the program will abort. You always need to append the number of floors and windows per floor together, otherwise the script will not evaluate the parameters completely and will replace both with default values.
Once you have made all the entries, you can optionally specify a fourth parameter for correcting the boundary distance to the neighboring property if you want to recreate the sample settlement from Figure 1 as shown in Listing 6. Table 1 explains the meaning of the assembly
and composite
tools, among other things.
Table 1
Command Line Tools in the ImageMagick package
Tool Name |
Function |
|
A standard tool from the ImageMagick package, it can convert file formats and scale, blur, crop, denoise, dither, rotate, flip images, and much more. |
|
Outputs a description of the format and characteristics of one or more graphics files. |
|
Offers the same functions as |
|
Overlaps two images. |
|
Assembles multiple images into one. |
|
Displays the differences between two graphs (as a report of a mathematical analysis and visually). |
|
Copies single or multiple pixel components of an image to another format (mainly intended for very large image files). |
|
Displays an image or image sequence via an X server. |
|
Creates screenshots in X11. The function optionally saves the entire screen area, the area of a window, or a defined rectangle. |
|
Interprets scripts in the MSL and executes them. |
Listing 6
Building a Skyline
Buy this article as PDF
(incl. VAT)
Buy Linux Magazine
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs
Subscribe to our ADMIN Newsletters
Support Our Work
Linux Magazine content is made possible with support from readers like you. Please consider contributing when you've found an article to be beneficial.
News
-
The GNU Project Celebrates Its 40th Birthday
September 27 marks the 40th anniversary of the GNU Project, and it was celebrated with a hacker meeting in Biel/Bienne, Switzerland.
-
Linux Kernel Reducing Long-Term Support
LTS support for the Linux kernel is about to undergo some serious changes that will have a considerable impact on the future.
-
Fedora 39 Beta Now Available for Testing
For fans and users of Fedora Linux, the first beta of release 39 is now available, which is a minor upgrade but does include GNOME 45.
-
Fedora Linux 40 to Drop X11 for KDE Plasma
When Fedora 40 arrives in 2024, there will be a few big changes coming, especially for the KDE Plasma option.
-
Real-Time Ubuntu Available in AWS Marketplace
Anyone looking for a Linux distribution for real-time processing could do a whole lot worse than Real-Time Ubuntu.
-
KSMBD Finally Reaches a Stable State
For those who've been looking forward to the first release of KSMBD, after two years it's no longer considered experimental.
-
Nitrux 3.0.0 Has Been Released
The latest version of Nitrux brings plenty of innovation and fresh apps to the table.
-
Linux From Scratch 12.0 Now Available
If you're looking to roll your own Linux distribution, the latest version of Linux From Scratch is now available with plenty of updates.
-
Linux Kernel 6.5 Has Been Released
The newest Linux kernel, version 6.5, now includes initial support for two very exciting features.
-
UbuntuDDE 23.04 Now Available
A new version of the UbuntuDDE remix has finally arrived with all the updates from the Deepin desktop and everything that comes with the Ubuntu 23.04 base.