# By max.maischein@econsult.de
#
# Simple recipe to create proper width= and height= attributes
# for
tags
sub PNGsize( $ ) {
# Returns a 2 element array containing the width and height of the image
my $Buffer = shift;
my ($Width, $Height) = ( undef, undef ); # Assume failure
if ($Buffer =~ /IHDR(.{8})/) {
# Now save the numbers
my $Data = $1;
($Width, $Height) = unpack( "NN", $Data );
} else { print "'$Filename' is no PNG image (or has weird format)\n"; };
return ($Width, $Height);
};
sub GIFsize( $ ) {
my $ID;
my $bytes = shift;
my ($Width, $Height) = (undef, undef);
if ($bytes =~ /^GIF8/) {
($ID, $Width, $Height) = unpack( "A6SS", $bytes );
} else {
print "imgsize:GIF:No GIF header found\n";
};
return ($Width,$Height);
};
sub JPGsize( $ ) {
my $buffer = shift;
my ($Width, $Height) = (undef, undef);
my $SOF = pack("CC", 0xFF, 0xC0 );
if ($buffer =~ /$SOF...(....)/ ) {
$buffer = $1;
($Height,$Width) = unpack( "nn", $buffer );
} else { print "imgsize:JPeG:No SOF header found\n"};
return ($Width, $Height);
};
sub img {
my $Filename = shift;
my $alt = shift || "";
my $attributes = shift || "";
my $ID;
$alt =~ s/(.+)/ alt=\"$1\" /;
my $result;
my $absdir;
if (!defined( &dirname )) {
use File::Basename;
};
$absdir = dirname( $inputfile );
my( $absname ) = build_path( $absdir, $Filename );
#print $absname, "\n";
my ($Width, $Height) = (undef, undef);
my $SizeFunc = undef; # assume failure
my $Buffer = "";
if ( open( IMGFILE, "<" . $absname )) {
binmode IMGFILE;
read( IMGFILE, $Buffer, 2048 ) or print "Error reading from '$absname' : $!\n";
close( IMGFILE ) or print "Error closing '$absname' : $!\n";
} else {
print "Error opening '$absname' : $!\n";
$Buffer = undef;
};
if (defined( $Buffer )) {
if ($Filename =~ /\.gif$/i) {
$SizeFunc = \&GIFsize;
} elsif ($Filename =~ /\.jpe?g$/i) {
$SizeFunc = \&JPGsize;
} elsif ($Filename =~ /\.png$/i) {
$SizeFunc = \&PNGsize;
} else {
print "\nUnknown file extension for image : $imagename (ignored)";
};
if (defined( $SizeFunc )) {
($Width, $Height) = &{$SizeFunc}( $Buffer );
};
};
$attributes .= ( $Width ? " width=\"$Width\"" : "" ) . ( $Height ? " height=\"$Height\"" : "" );
$result = "
";
return( $result );
};