Hack 2. Convert from One Image Format to Another
Use the ImageMagick convert tool to change between image formats.
When you deal with images on a regular basis, it's often useful to convert them to different image formats. You can use graphical tools such as the GIMP to open files and save them into different formats, but if you deal with a lot of images you might find that process a bit cumbersome. The ImageMagick tool convert solves this problem by providing a command-line interface to image conversion. With convert you can change any ImageMagick-supported image format to any other ImageMagick-supported image format. The full list of supported formats is rather largeyou can view the full list in the ImageMagick man page (the man page is ImageMagick, not imagemagick)but among the supported formats are BMP, CMYK, GIF, JPEG, PBM, PNG, RGB, SVG, TIFF, and XPM.
The ImageMagick tools are commonly used by a number of other frontends, so you are likely to find the convert tool already packaged for your distribution with the rest of the ImageMagick tools. The standard usage of convert is simple: provide an input file and an output file as arguments, and convert will figure out the format based on the file extension. So, to convert a BMP to a PNG, type:
$ convert image.bmp image.png
One of the advantages to a command line image conversion tool is that it lends itself really well to scripting. For instance, the following command converts an entire directory of BMP files to JPEGthe bit of sed in the command preserves the filenames but changes the extension to .jpg, and the results are fed to convert, which knows from the extension what format to make the new files:
$ for i in *.bmp; do j=`echo $i | sed -e 's/\.bmp/\.jpg/'`; \ convert $i $j; done;
1.3.1. Tile Images
convert also supports a wide range of image processing functions it can perform as it is converting an image. Even if you don't want to convert from one image format to another, you can still use convert to process the image into a new file. For instance, the tile argument tells convert to tile the input image into an output image of a size you specify with the -size argument. To take a 16 x 16 JPEG image and tile it across a new 640 x 480 JPEG image, you would type:
$ convert -size 640x480 tile :image.jpg tiledimage.jpg
Replace image.jpg and tiledimage.jpg with the input file and output files, respectively.
1.3.2. Add a Border to an Image
The -border and -bordercolor arguments let you add a border of specified width and height to an image. The width you specify applies to the left and right of the image, while the height applies to the top and bottom of the image. You can pass a color either in text (red, blue, white, etc.) or as an RGB value. To add a white border around an image (so it looks like a photographic print), type:
$ convert -border 15x18 -bordercolor white image.jpg image2.jpg
The first border measurement sets the width of the top and bottom border edges; the second measurement sets the width for the left and right borders.
The color names come from X's rgb.txt file. To view the contents of this file without having to locate it, use this command:
$ showrgb 255 250 250 snow 248 248 255 ghost white 248 248 255 GhostWhite 245 245 245 white smoke 245 245 245 WhiteSmoke …
You can also surround your image with a beveled frame with the -frame and accompanying -mattecolor options. The -frame argument accepts a width and height for the frame itself, plus an optional width for a beveled edge on the outer and inner edge of the frame, respectively. The mattecolor option accepts a hexadecimal RGB value. So, to add a red 25 x 25-pixel red frame to an image with a 5-pixel outer bevel, type:
$ convert -frame 25x25+5x5 -mattecolor "#FF0000" image.jpg framedimage.jpg
1.3.3. Flip and Flop Images
The -flip and -flop arguments allow you to flip an image up and down or left and right, respectively. The -flop argument will convert the image so it looks like it would in a mirror, and the -flip argument flips it upside down. You can also combine the arguments .