7 # convert image.tga -depth 8 RGBA:- | perl fiximage.pl 72 | convert -depth 8 -size 72x56 RGBA:- output.tga
15 read STDIN, my $data, 4
17 my ($r, $g, $b, $a) = unpack "CCCC", $data;
18 push @pixels, [$r, $g, $b, $a];
21 my $height = @pixels / $width;
23 for my $y(0..($height-1))
25 for my $x(0..($width-1))
28 if $pixels[$x + $y * $width][3] != 0;
29 # alpha is zero? Replace by weighted average.
30 my ($r, $g, $b, $a) = (0, 0, 0);
34 next if $y + $dy >= $height;
38 next if $x + $dx >= $width;
39 my $pix = $pixels[($x + $dx) + ($y + $dy) * $width];
40 $r += $pix->[0] * $pix->[3];
41 $g += $pix->[1] * $pix->[3];
42 $b += $pix->[2] * $pix->[3];
48 push @fixlater, [$x, $y];
49 $pixels[$x + $y * $width] = [0, 0, 0, 0, undef];
55 print STDERR "Fixing ($x, $y -> $r, $g, $b, $a)\n";
56 $pixels[$x + $y * $width] = [$r, $g, $b, 0];
62 print STDERR "Pixels left: ", scalar(@fixlater), "\n";
64 # These pixels have no neighbors with a non-zero alpha.
65 my @fixels = @fixlater;
67 my @pixelsorig = @pixels;
71 my ($r, $g, $b, $a) = (0, 0, 0, 0);
75 next if $y + $dy >= $height;
79 next if $x + $dx >= $width;
80 my $pix = $pixelsorig[($x + $dx) + ($y + $dy) * $width];
91 push @fixlater, [$x, $y];
97 #print STDERR "Fixing later ($x, $y -> $r, $g, $b, $a)\n";
98 $pixels[$x + $y * $width] = [$r, $g, $b, 0];
104 print pack "CCCC", @$_;