package imgbbs; ;# 9:32 2003/11/02 ;# resize.pl.netpbm ;# suga@snpn.net sub note{ my $note = 'resize.pl.netpbm(2003/11/02)'; return $note; } sub imgresize{ my ($src,$dst,$w,$h,$jpegq,$del_flag) = @_; unless($w =~ /^\d+$/ || $h =~ /^\d+$/){ return 0;} my @src = imgbbs::GetImageSize($src); unless($src[2] >= 1 && $src[2] <= 3){ return 0; } unless($jpegq =~ /^\d+$/){ $jpegq = 75;} if($jpegq < 1 || $jpegq > 100){ $jpegq = 75; } eval{ if ($src[2] == 2){ `djpeg $src | pnmscale -xsize $w -ysize $h | cjpeg -quality $jpegq > $dst`; }elsif($src[2] == 3){ `pngtopnm $src | pnmscale -xsize $w -ysize $h | cjpeg -quality $jpegq > $dst`; }elsif($src[2] == 1){ `giftopnm $src | pnmscale -xsize $w -ysize $h | cjpeg -quality $jpegq > $dst`; } }; chmod (0666,$dst); if($del_flag == 1){ unlink($dst) if(-e $dst && (-s $dst) > (-s $src)); } if(-e $dst){ return 1 ;} return 0; } sub GetImageSize{ my $src = $_[0]; my $buff; my $width = 0; my $height = 0; my $formatno = 0; open(IMG,$src)|| return 0; binmode(IMG); read(IMG, $buff, 4); if($buff =~ /^GIF/){ seek(IMG, 6, 0); read(IMG, my $buff, 4); $width = unpack("v",substr($buff,0,2)); $height = unpack("v",substr($buff,2,2)); $formatno = 1; }elsif($buff =~ /PNG/){ seek(IMG, 16, 0); read(IMG, my $buff, 8); $width = unpack("N", substr($buff, 0, 4)); $height = unpack("N", substr($buff, 4, 8)); $formatno = 3; }elsif($buff =~ /^\xff\xd8/){ seek(IMG, 2, 0); while (1) { read(IMG, my $buff, 4); my ($a, $b, $c) = unpack("a a n", $buff); if ($a ne "\xFF") { $width = $height = 0; last; }elsif ((ord($b) >= 0xC0) && (ord($b) <= 0xC3)){ read(IMG, $buff, 5); ($height, $width) = unpack("xnn", $buff); last; }else{ read(IMG, my $buff, ($c - 2)); } } $formatno = 2; } close(IMG); if($formatno < 1 || $width < 1 || $height < 1){ return 0; } return ($width,$height,$formatno,"width=\"$width\" height=\"$height\""); } 1;