Before posting snapshots I've taken with my digital camera to the web, I used to go through the same old steps with GIMP. First, I'd reduce the image size to a width of 1,000 pixels because the image size my Nikon D70 gives me is just too much for the web and uploading the images takes too long. Also, to improve the contrast, correct any color casting, and make images tack-sharp with GIMP's Sharpen function, I typically select a value of 20.
As you might know, GIMP has a convenient scripting interface that lets users automate recurring tasks, and you can even run it at the command line without launching the GUI. GIMP developers have made some fairly significant changes to the whole API and nothing works the way it used to. Fortunately, GIMP documents the functions completely and thoroughly in the Xtns | Procedure Browser menu.
The standard interface is implemented in the rocket scientist's favorite programming language, Scheme.
Perl Module
Thank goodness there is a Perl module. I needed a couple of tricks to install it on Ubuntu 7.10, and I'll explain the steps later. After the install, you can run the picfix script (Listing 1) at the command line by typing picfix file.jpg. Under the hood, the script calls GIMP (without the GUI) and then invokes register() to register the picfix() function.
Strangely, the GIMP interface insists on scripts that run at the command line, creating a menu entry, and picfix has no option but to comply. Line 49 of the script calls the main() function that branches off to GIMP and returns after completing its chores, and exit makes sure that the script gives the return code from main() before quitting.
Figure 1 shows the original image, a picture taken from my balcony in San Francisco with the early evening sun lighting up the city nicely. Despite this, I still wasn't happy with the colors in the original.

|
|
Figure 1: The original image is color cast and the contrast could be better.
|
001 #!/usr/bin/perl
002 # Mike Schilli, 2008
003 # (m@perlmeister.com)
004 use warnings;
005 use strict;
006
007 use Gimp qw(:auto);
008 use Gimp::Fu;
009 use ColorCast;
010 use Getopt::Std;
011 use Log::Log4perl qw(:easy);
012
013 my $viewer = "eog";
014
015 Log::Log4perl->easy_init(
016 $DEBUG);
017
018 getopts("xl:c:a:s:",
019 \my %opts);
020
021 $opts{a} ||=
022 "green"; # color adjust
023 $opts{s} ||= "1000"; # size
024 $opts{l} ||= 1; # autolevel
025
026 DEBUG "Starting up";
027
028 my $menu =
029 "<Toolbox>/Xtns/Perl-Fu/Picfix";
030
031 my $file = $ARGV[0];
032 die "No file"
033 unless defined $file;
034
035 register(
036 "perl_fu_picfix", # Name
037 "Fix Colors and More"
038 , # Explain
039 "", # Help
040 "", # Author
041 "", # Copyright
042 "", # Date
043 $menu, # Menu
044 "*", # Images accepted
045 [undef], # No parameters
046 \&picfix # Function
047 );
048
049 exit main();
050
051 #############################
052 sub picfix {
053 #############################
054
055 my $img =
056 gimp_file_load(
057 RUN_NONINTERACTIVE, $file,
058 $file);
059
060 die "Can't load $file"
061 unless $img;
062
063 my $layer =
064 image_get_active_layer(
065 $img);
066
067 scale_image_down($img,
068 $opts{s});
069
070 $layer =
071 $img->get_active_layer();
072 if ($opts{l}) {
073 DEBUG "Autolevel [$file]";
074 gimp_levels_stretch(
075 $layer);
076 }
077
078 if ($opts{c}) {
079 my $colorcast =
080 ColorCast->new(
081 yml_file => $opts{c},
082 drawable => $layer,
083 );
084 $colorcast->load();
085 $colorcast->adjust_to(
086 $opts{a});
087 }
088
089 DEBUG "Sharpening $file";
090 $img->plug_in_sharpen(
091 $layer, 20);
092
093 $file =~ s/\./-1./g;
094 $file =~ s/\.nef$/.png/g;
095
096 DEBUG "Saving $file";
097 gimp_file_save(
098 RUN_NONINTERACTIVE,
099 $img, $layer,
100 $file, $file
101 );
102
103 system("$viewer $file")
104 if $opts{x};
105 return $img;
106 }
107
108 #############################
109 sub scale_image_down {
110 #############################
111 my ($img, $size) = @_;
112
113 my $w = $img->image_width();
114 my $h =
115 $img->image_height();
116
117 if ($w >= $h) {
118 if ($w > $size) {
119 $h = int($h * $size / $w);
120 $w = $size;
121 } else {
122 return 1;
123 }
124 } else {
125 if ($h > $size) {
126 $w = int($w * $size / $h);
127 $h = $size;
128 } else {
129 return 1;
130 }
131 }
132
133 DEBUG "Resizing to $w x $h";
134 $img->image_scale($w, $h);
135 }
Picfix
Running picfix gave me the results you can see in Figure 2. The contrast is vastly improved and the colors are far more realistic.

|
|
Figure 2: After retouching with picfix, the colors are far more natural and the contrast is much improved.
|
The picfix() function defined in lines 52ff., which GIMP executes as a callback, runs the gimp_file_load() function that loads the digital image from a given file on disk. A call to image_scale() (line 134) scales the image to a width of 1,000 pixels.
The gimp_levels_stretch() function (line 74) then simulates the Auto button in the GIMP Levels dialog and maximizes the contrast by distributing the color values used in the image across the whole of the available bandwidth.
The plug_in_sharpen() method (line 90) with a parameter of 20 then improves the focus, then gimp_file_save() (line 97) saves the file as file-1.jpg using the original format. Whether the image is a JPEG or PNG makes no difference; internally, the load/save methods hand control over to the GIMP routines for the format in question.
Loading the supporting modules by calling use Gimp qw(:auto) and use Gimp::Fu has the practical side effect of loading all of GIMP's functions into the script's namespace. Programmers will be happy to hear that the :auto tag also includes GIMP constants, such as RUN_NONINTERACTIVE.
Options
Image rescaling defaults to a width of 1,000 pixels; however, the -s (size) command-line option supports arbitrary values. A command line of picfix -s 500 file.jpg reduces the maximum image width to 500 pixels, for example, with the maximum size relating to the width in landscape images, but to the height in portrait format. The scale_image_down() subroutine in line 109ff. provides the If/Else logic for this.
If you prefer to check the results of your scripted actions on the image, you can set the -x (for X Window) option to view the image in the viewer set as a default in line 13 (in this case, Eye of Gnome, eog).
To disable the Autolevel function, which does not always return satisfactory results, set the -l 0 option.
Comments