#!/usr/app/bin/perl eval 'exec /usr/app/bin/perl -S $0 ${1+"$@"}' if 0; # not running under some shell use Gimp qw(:auto N_ __); use Gimp::Fu; # This script requires a Gimp version >= 0.96 (I haven't checked - ymmv) # small changes by Marc Lehmann # prep4gif.pl # by Seth Burgess # June 29, 1998 # # This perl plug-in prepares a multilayer RGB image for use as a # transparent gif. To use this prpoerly, you want to have something # close to the intended background as the bottom layer. If convert # to indexed is not selected, the bottom two options are unused. # # TODO: Write a nicer GUI than Gimp::Fu provides (learn some gtk) # Anything else that seems useful # Gimp::set_trace(TRACE_ALL); sub prep { my ($img, $drawable, $threshold, $growth, $index, $dither, $colors) = @_; # Duplicate this image, and work on the duplicate for the rest of the # procedure. my $out = gimp_channel_ops_duplicate($img); # @layers is the ordered list, from top to bottom, of all layers in the # duplicated image. To find length of the list, use $#layers my @layers = gimp_image_get_layers($out); # if there's not enough layers, abort. if ($#layers <= 0) { gimp_message(__"You need at least 2 layers to perform prep4gif"); return; } # Show the image early - this makes debugging a breeze my $newdisplay = gimp_display_new($out); # Hide the bottom layer, so it doesn't get into the merge visible later. my $bottomlayer = $layers[$#layers]; gimp_layer_set_visible($bottomlayer, 0); gimp_layer_add_alpha($bottomlayer); # NOTE TO PERL NEWBIES - 'my' variables should be declared in their outermost # scope - if defined inside the if statement, will disappear to program. my $foreground; if ($#layers > 1) { $foreground = gimp_image_merge_visible_layers($out, 0); } else { $foreground = $layers[0]; }; my $layer_mask = gimp_layer_create_mask($foreground,2); gimp_image_add_layer_mask ($out, $foreground, $layer_mask); gimp_threshold($layer_mask,$threshold,255); # Transfer layer mask to selection, and grow the selection gimp_selection_layer_alpha($foreground); gimp_selection_grow($out,$growth); # Apply this selection to the background gimp_layer_set_visible($bottomlayer, 1); gimp_image_set_active_layer($out, $bottomlayer); gimp_selection_invert($out); gimp_edit_cut($bottomlayer); # Clean up after yourself gimp_image_remove_layer_mask($out, $foreground, 1); my $outlayer = gimp_image_merge_visible_layers($out,0); # Convert to indexed if ($index) { gimp_convert_indexed($out,1, MAKE_PALETTE, $colors, $dither, 1, ""); } # Show all the changes. gimp_displays_flush(); (); } register "prep4gif", "Prep for gif", "Make the image a small-cut-out of the intended background, so your transparent text doesn't look blocky.", "Seth Burgess", "Seth Burgess ", "2-15-98", N_"/Filters/Web/Prepare for GIF...", "RGB*", [ [PF_INT32, "lower_threshold", "Lower Alpha Threshold", 64], [PF_INT32, "growth", "How Much growth for safety ",1], [PF_TOGGLE, "convert_to_indexed", "Convert Image to indexed", 0], [PF_TOGGLE, "dither", "Floyd-Steinberg Dithering?", 1], [PF_INT32, "colors", "Colors to quantize to", "255"], ], \&prep; exit main;