#!/usr/local/bin/perl #============================================================================================================ # # 画像サイズ変換CGI(i.cgi) # i.cgi # --------------------------------------------- # 2004.2.13 start #------------------------------------------------------------------------------------------------------------ # # resize ; 画像のリサイズ # check ; 端末の判別 # error ; エラー出力 # #============================================================================================================ use strict; BEGIN{ my($path,$lib); $| = 1; $path = $ENV{'SCRIPT_FILENAME'}; $path =~ m|(.+)/|o; $path = "$1/module"; $lib = "$1/lib"; unshift(@INC,$lib); unshift(@INC,$path); require('qin.pl'); require('isildur.pl'); require('melkor.pl'); } CGImain(); EndOfCGI(); #------------------------------------------------------------------------------------------------------------ # # 画像のリサイズ変換 # ------------------------------------------- # 引 数:なし # 戻り値:なし # #------------------------------------------------------------------------------------------------------------ sub CGImain { my $Q = new QIN; my $I = new ISILDUR; my $M = new MELKOR; my ($IMG,$ext,$num,$mx,$my,$p,$x,$x2,$y,$y2,@Arg); my ($buffer,$data,$filename,$src,$dst,$type,$path); @Arg = split(/\//,$ENV{'PATH_INFO'}); $M->Set('MODE',0); # モードはread $M->Set('BBS',$Arg[1]); # bbs名 $M->Set('KEY',$Arg[2]); # key $M->Set('AGENT',1); $M->MakeAnyPath(); error($M,$I,999) if(!$I->Load($M)); error($M,$I,'画像が存在しません') if(!$Arg[1] or !$Arg[2] or !$Arg[3]); error($M,$I,'画像が存在しません') if(!-e $M->Get('PATH-BBS0').'/img/'.$M->Get('KEY')."/$Arg[3]"); $Q->LoadInit($M,$I); if ($Q->Check('LOADAVG')){ require('fatima.pl'); if(FATIMA->new($Q)->check){ error($M,$I,602); } } $data = $M->Get('DATA'); $path = $ENV{'SCRIPT_FILENAME'} || './'; $path =~ m|(.+)/|o; $path = $1.'/cache'; $filename = crypt(substr(time,0,-8),substr($$,0,-2)); # 仮ファイル名生成 $filename =~ tr|./|__|; ($num,$ext) = split(/\./,$Arg[3]); my $r = [$Q->getsize($M,$ext,$num)]; my ($c,$switch) = check($Q,$M,$num,$ext); $type = $c->[2]; unless($switch){ my $rd; my $wt; $src = $M->Get('PATH-BBS0').'/img/'.$M->Get('KEY')."/$Arg[3]"; eval{ require File::Copy; File::Copy->import(qw(copy)); copy($src,"$path/$filename.$type") or die; }; if($@){ error($M,$I,"IOエラーが発生しました
$@"); } $type = 'jpeg' if $type eq 'jpg' or $type eq ''; print "Content-type: image/$type\n\n"; } elsif(-x "$data/repng2jpeg" and ($type eq 'jpg' or $type eq 'png')){ $src = $M->Get('PATH-BBS0').'/img/'.$M->Get('KEY')."/$Arg[3]"; $dst = "$path/$filename.$type"; if($r->[0] > $c->[0] or $r->[1] > $c->[1]){ $x2 = $c->[0] / $r->[0]; $y2 = $c->[1] / $r->[1]; ($x2 < $y2) ? ($p = $x2) : ($p = $y2); $r->[0] = int ($r->[0] * $p); $r->[1] = int ($r->[1] * $p); } $ENV{'PATH'} = "/usr/bin:/usr/local/bin"; eval{ open(SYSTEM,"| $data/repng2jpeg $src $dst $r->[0] $r->[1] 90") or die "Exec error: $! $?\n"; close(SYSTEM) or die "Exec error: $! $?\n"; }; if(length $@ > 0){ error($M,$I,"repng2jpegの実行が失敗しました
$@"); } $type = 'jpeg' if $type eq 'jpg' or $type eq ''; print "Content-type: image/$type\n\n"; } else{ eval{ require Image::Magick; my $err; my $src = $M->Get('PATH-BBS0').'/img/'.$M->Get('KEY')."/$Arg[3]"; $IMG = Image::Magick->new; # オブジェクト作成 $IMG->Read($src); ($x,$y) = $IMG->Get('width','height'); my $base = $x > $y ? 1 : 0; # 横長かどうか my $spec = $c->[1] > $c->[0] ? 1 : 0; # 携帯が縦長か my $geometry = $base & $spec ? $c->[1] : $c->[0]; $err = $IMG->Scale(geometry => $geometry) and die $err; # 比率による縮小 ($x,$y) = $IMG->Get('width','height'); if($base){ $err = $IMG->Rotate(degrees => 90) and die $err; } $err = $IMG->Trim and die $err; $err = $IMG->Write("$path/$filename.$type") and die $err; # 仮ファイル作成 }; if(length $@ > 0){ error($M,$I,"Image::Magickの実行が失敗しました
$@"); } $type = 'jpeg' if $type eq 'jpg' or $type eq ''; print "Content-type: image/$type\n\n"; } $type = 'jpg' if $type eq 'jpeg'; eval{ chmod(0666,"$path/$filename.$type"); }; open(my $fh,"<$path/$filename.$type") or die "Can't open file($filename.$type): $!\n"; # 仮ファイルを開く binmode($fh); binmode(STDOUT); print $buffer while (read($fh,$buffer,1024)); # 標準出力 close($fh); unlink("$path/$filename.$type") or die "Can't open file: $!\n"; } #------------------------------------------------------------------------------------------------------------ # # 端末判別 # ------------------------------------------- # 引 数:$Q,$M : モジュール # $num : ファイル番号 # $ext : ファイル拡張子 # 戻り値:$x : 幅 # $y : 高 # $type : 出力する拡張子 # #------------------------------------------------------------------------------------------------------------ sub check { my ($Q,$M,$num,$ext) = @_; my ($x,$y,$n); my $ua = $ENV{'HTTP_USER_AGENT'}; my $table = SpecTable(); my %pdx; while(my($key,$carrer) = each %$table){ if(index($ua,$key) >= 0){ while(my($key,$spec) = each %$carrer){ if(index($ua,$key) >= 0){ $spec->[2] = 'jpg' if $ext eq 'jpg'; if($spec->[2] eq 'gif,png'){ $spec->[2] = $ext eq 'gif' ? 'gif' : 'png'; } return ($spec,1); } } } } return ([$Q->getsize($M,$ext,$num),$ext],0); } #------------------------------------------------------------------------------------------------------------ # # エラー表示 # ------------------------------------------- # 引 数:$M : モジュール # 戻り値:なし # #------------------------------------------------------------------------------------------------------------ sub error { require('aragorn.pl'); require('denethor.pl'); require('elrond.pl'); require('thorin.pl'); my ($M,$I,$error) = @_; my $A = new ARAGORN; my $D = new DENETHOR; my $E = new ELROND; my $O; my $T = new THORIN; my ($back,$bbsPath,$ver); $D->Load($M); # バナーロード if ($error =~ /^\d+$/){ # SETTING読み込み require('orald.pl'); $O = new ORALD; $O->Load($M); $O->Print($T,$M,$error,$M->Get('AGENT')); # エラー表示 exit; } $ver = $M->Get('VERSION'); $E->PrintHTMLHeadA($T,$M,$M->Get('AGENT'),'',$A->GetSubject(),'Shift_JIS'); # ヘッダ出力 $E->PrintHTMLBodyA($T,$I,$M->Get('AGENT')); # BODY出力 $D->Print($T,$M,100,2); $T->Print("$error
\n"); $bbsPath = $M->Get('PATH-BBS1') . '/i/'; $T->Print(" "); # mindexに戻る $back = $ENV{'HTTP_REFERER'}; $T->Print("

"); # 前表示 $T->Print("$ver"); $T->Flush(0,0,''); # STD出力 EndOfCGI();; } #------------------------------------------------------------------------------------------------------------ # # CGIの終了処理 - EndOfCGI # ------------------------------------------------ # 引 数:なし # 戻り値:なし # #------------------------------------------------------------------------------------------------------------ sub EndOfCGI { if($ENV{'MOD_PERL'}){ require mod_perl; if($mod_perl::VERSION >= 1.99){ require ModPerl::Util; ModPerl::Util::exit(0); } else{ Apache->exit; } } else{ exit(0); } } #------------------------------------------------------------------------------------------------------------ # # 携帯の端末情報 - SpecTable # ------------------------------------------------ # 引 数:なし # 戻り値:ハッシュのリファレンス # #------------------------------------------------------------------------------------------------------------ sub SpecTable { return { 'DoCoMo/2.0' => { # DoCoMo Foma 'F700i' => [240,320,'gif'], 'P901i' => [240,320,'gif'], 'D901i' => [240,320,'gif'], 'N901iC' => [240,320,'gif'], 'SH901iC' => [240,320,'gif'], 'F880iES' => [240,320,'gif'], 'N900iG' => [240,269,'gif'], 'N900iL' => [240,269,'gif'], 'F900iC' => [240,320,'gif'], 'D900i' => [240,320,'gif'], 'N900iS' => [240,269,'gif'], 'P900iV' => [240,266,'gif'], 'F900iT' => [240,320,'gif'], 'SH900i' => [240,320,'gif'], 'P900i' => [240,266,'gif'], 'N900i' => [240,269,'gif'], 'F900i' => [240,320,'gif'], 'N2701' => [176,198,'gif'], 'N2102V' => [176,198,'gif'], 'F2102V' => [176,182,'gif'], 'P2102V' => [176,198,'gif'], 'N2051' => [176,198,'gif'], 'F2051' => [176,182,'gif'], 'T2101V' => [176,144,'gif'], 'SH2101V' => [320,240,'gif'], 'P2101V' => [176,164,'gif'], 'D2101V' => [132,142,'gif'], 'P2002' => [120,130,'gif'], 'N2002' => [120,130,'gif'], 'N2001' => [120,130,'gif'] }, 'DoCoMo/1.0' => { # DoCoMo Mova 'P213i' => [132,176,'gif'], 'P253iS' => [132,176,'gif'], 'D253iWM' => [220,176,'gif'], 'P253i' => [132,176,'gif'], 'N253i' => [160,198,'gif'], 'D253i' => [176,240,'gif'], 'SO506i' => [240,320,'gif'], 'N506iS' => [240,320,'gif'], 'SO506iC' => [240,320,'gif'], 'SH506iC' => [240,320,'gif'], 'P506iC' => [240,320,'gif'], 'N506i' => [240,320,'gif'], 'F506i' => [240,268,'gif'], 'D506i' => [240,270,'gif'], 'P252iS' => [132,176,'gif'], 'N252i' => [132,158,'gif'], 'P252i' => [132,176,'gif'], 'SH252i' => [240,320,'gif'], 'D252i' => [176,240,'gif'], 'F505iGPS' => [240,268,'gif'], 'SH505iS' => [240,320,'gif'], 'SO505iS' => [240,320,'gif'], 'N505iS' => [240,320,'gif'], 'P505iS' => [240,320,'gif'], 'D505iS' => [240,320,'gif'], 'P505i' => [240,320,'gif'], 'F505i' => [240,268,'gif'], 'N505i' => [240,320,'gif'], 'SH505i' => [240,320,'gif'], 'SO505i' => [256,320,'gif'], 'D505i' => [240,320,'gif'], 'SO213iS' => [128,128,'gif'], 'SO213i' => [128,128,'gif'], 'F672i' => [160,120,'gif'], 'F661i' => [132,156,'gif'], 'SO212i' => [128,128,'gif'], 'F212i' => [132,156,'gif'], 'F671iS' => [160,120,'gif'], 'P251iS' => [132,176,'gif'], 'N251iS' => [132,158,'gif'], 'N251i' => [132,158,'gif'], 'F251i' => [132,144,'gif'], 'D251iS' => [132,160,'gif'], 'D251i' => [132,160,'gif'], 'P504iS' => [132,176,'gif'], 'P504i' => [132,144,'gif'], 'SO504i' => [128,128,'gif'], 'N504iS' => [160,198,'gif'], 'N504i' => [132,176,'gif'], 'F504iS' => [132,136,'gif'], 'F504i' => [132,136,'gif'], 'D504i' => [132,160,'gif'], 'R692i' => [96,113,'gif'], 'SH251iS' => [176,220,'gif'], 'SH251i' => [120,160,'gif'], 'R211i' => [96,160,'gif'], 'SO211i' => [120,120,'gif'], 'P211iS' => [120,130,'gif'], 'P211i' => [120,130,'gif'], 'N211iS' => [120,145,'gif'], 'N211i' => [120,145,'gif'], 'D211i' => [100,120,'gif'], 'F211i' => [96,113,'gif'], 'SO210i' => [120,120,'gif'], 'D210i' => [96,120,'gif'], 'D503iS' => [132,142,'gif'], 'D503i' => [132,142,'gif'], 'SO503iS' => [120,120,'gif'], 'SO503i' => [120,120,'gif'], 'N503iS' => [120,130,'gif'], 'N503i' => [120,130,'gif'], 'P503iS' => [120,115,'gif'], 'P503i' => [120,115,'gif'], 'F503iS' => [120,130,'gif'], 'F503i' => [120,130,'gif'], 'KO210i' => [96,96,'gif'], 'P210i' => [96,91,'gif'], 'N210i' => [120,127,'gif'], 'F210i' => [96,113,'gif'], 'F671i' => [120,126,'gif'], 'P209iS' => [96,91,'gif'], 'KO209i' => [96,96,'gif'], 'F209i' => [96,78,'gif'], 'D209i' => [96,120,'gif'], 'SO502iWM' => [120,120,'gif'], 'N502it' => [118,114,'gif'], 'F502it' => [96,78,'gif'], 'N502i' => [118,114,'gif'], 'F502i' => [96,78,'gif'], 'D502i' => [96,64,'gif'] }, 'UP.Browser' => { # au 'SA33' => [240,320,'png'], 'SA32' => [240,320,'png'], 'HI33' => [240,320,'png'], 'CA31' => [240,400,'png'], 'TS31' => [240,320,'png'], 'SA31' => [240,320,'png'], 'SN31' => [240,320,'png'], 'KC32' => [240,320,'png'], 'HI32' => [132,176,'png'], 'KC31' => [240,320,'png'], 'HI31' => [240,320,'png'], 'ST25' => [240,320,'png'], 'ST22' => [132,176,'png'], 'ST24' => [240,320,'png'], 'TS28' => [240,320,'png'], 'SA27' => [240,320,'png'], 'TS27' => [240,320,'png'], 'SA26' => [240,320,'png'], 'KC25' => [240,320,'png'], 'KC24' => [240,320,'png'], 'TS26' => [240,320,'png'], 'CA26' => [240,320,'png'], 'CA25' => [240,320,'png'], 'ST23' => [132,176,'png'], 'SN25' => [240,320,'png'], 'CA24' => [240,320,'png'], 'SN24' => [240,320,'png'], 'CA23' => [132,176,'png'], 'ST21' => [132,176,'png'], 'KC22' => [132,176,'png'], 'TS24' => [144,176,'png'], 'HI24' => [132,176,'png'], 'HI23' => [132,176,'png'], 'CA23' => [132,163,'png'], 'TS23' => [144,176,'png'], 'TS21' => [144,135,'png'], 'SN29' => [240,320,'png'], 'KC26' => [240,320,'png'], 'SN27' => [240,320,'png'], 'SN28' => [240,320,'png'], 'SN26' => [240,320,'png'], 'KC23' => [132,176,'png'], 'SA28' => [132,176,'png'], 'TS25' => [144,176,'png'], 'SA25' => [132,176,'png'], 'SA24' => [132,176,'png'], 'SN23' => [120,145,'png'], 'SN22' => [120,120,'png'], 'SA22' => [132,176,'png'], 'SN21' => [120,120,'png'], 'TS22' => [144,156,'png'], 'CA21' => [132,147,'png'], 'SA21' => [132,128,'png'], 'MA21' => [132,176,'png'], 'KC21' => [128,120,'png'], 'HI21' => [120,116,'png'], 'ST14' => [132,147,'png'], 'KC15' => [120,160,'png'], 'KC14' => [120,120,'png'], 'ST13' => [128,129,'png'], 'SN17' => [120,120,'png'], 'SY15' => [120,128,'png'], 'CA14' => [120,109,'png'], 'HI14' => [120,112,'png'], 'TS14' => [96,112,'png'], 'KC13' => [120,120,'png'], 'SN16' => [120,120,'png'], 'SN15' => [120,120,'png'], 'SY14' => [120,128,'png'], 'ST12' => [120,104,'png'], 'TS13' => [96,112,'png'], 'CA13' => [120,96,'png'], 'MA13' => [120,115,'png'], 'HI13' => [120,112,'png'], 'SN13' => [120,120,'png'], 'SY13' => [120,96,'png'], 'SN14' => [120,120,'png'], 'SN12' => [120,120,'png'], 'ST11' => [120,108,'png'], 'DN11' => [120,112,'png'], 'SY12' => [120,128,'png'], 'KC12' => [120,111,'png'], 'CA12' => [127,93,'png'], 'TS12' => [96,112,'png'], 'HI12' => [120,96,'png'], # TU-KA 'KCU1' => [120,137,'png'], 'SYT5' => [132,144,'png'], 'KCTD' => [120,137,'png'], 'TST8' => [144,176,'png'], 'TST7' => [144,176,'png'], 'KCTC' => [120,137,'png'], 'SYT4' => [120,137,'png'], 'KCTB' => [144,155,'png'], 'KCTA' => [120,137,'png'], 'TST6' => [144,155,'png'], 'KCT9' => [120,137,'png'], 'TST5' => [144,133,'png'], 'TST4' => [120,143,'png'], 'KCT8' => [120,137,'png'], 'SYT3' => [120,128,'png'], 'KCT7' => [96,104,'png'], 'MIT1' => [120,117,'png'], 'MAT3' => [96,108,'png'], 'KCT6' => [96,104,'png'], 'TST3' => [120,128,'png'], 'KCT5' => [96,104,'png'], 'KCT4' => [96,104,'png'], 'SYT2' => [96,92,'png'] }, 'J-PHONE/' => { # Vodafone and J-Phone 'V801SH' => [240,320,'png'], 'V801SA' => [240,320,'png'], 'V601SH' => [240,320,'png'], 'J-SH53' => [240,320,'png'], 'V601N' => [160,216,'png'], 'J-N51' => [160,216,'png'], 'J-SH52' => [120,160,'png'], 'J-SA51' => [132,176,'png'], 'J-P51' => [120,160,'png'], 'J-T51' => [144,176,'png'], 'J-K51' => [128,160,'png'], 'J-SH51' => [120,160,'png'], 'V401T' => [240,320,'png'], 'V301SH' => [240,320,'png'], 'V401SH' => [240,320,'png'], 'J-T010' => [240,320,'png'], 'J-D08' => [132,176,'png'], 'J-SH010' => [240,320,'png'], 'J-T08' => [240,320,'png'], 'J-SH09' => [120,160,'png'], 'J-SH08' => [120,160,'png'], 'J-N05' => [160,216,'png'], 'J-N04' => [120,160,'png'], 'J-D06' => [132,162,'png'], 'J-D05' => [132,162,'png'], 'J-T06' => [120,160,'png'], 'J-SH07' => [120,160,'png'], 'V303T' => [240,320,'png'], 'V302T' => [144,176,'png'], 'V301D' => [132,176,'png'], 'V301T' => [240,320,'png'], 'J-SA06' => [132,176,'png'], 'J-T09' => [144,176,'png'], 'J-D07' => [128,128,'png'], 'J-T07' => [144,176,'png'], 'J-SA05' => [120,144,'png'], 'J-NM02' => [120,143,'png'], 'J-K05' => [120,143,'png'], 'J-SA04' => [120,143,'png'], 'J-D31' => [120,143,'png'], 'J-N03 II' => [120,160,'png'], 'J-NM01' => [120,160,'png'], 'J-DN03' => [120,143,'png'], 'J-SA03' => [120,160,'png'], 'J-SH06' => [96,130,'png'], 'J-PE03 II' => [120,143,'png'], 'J-D04' => [120,143,'png'], 'J-K04' => [120,143,'png'], 'J-T05' => [120,144,'png'], 'J-N03' => [120,160,'png'], 'J-N03S' => [120,160,'png'], 'J-SH05' => [120,160,'png'], 'J-SH05S' => [120,160,'png'], 'J-SH04B' => [120,160,'png'], 'J-SH04BS' => [120,160,'png'], 'J-SH04' => [96,130,'png'], 'J-SH04S' => [96,130,'png'], 'J-PE03' => [96,130,'png'], 'J-PE03S' => [96,130,'png'], 'J-D03' => [120,143,'png'], 'J-D03S' => [120,143,'png'], 'J-K03' => [120,143,'png'], 'J-P03' => [96,120,'png'], 'J-T04' => [96,108,'png'], 'J-SH03' => [96,117,'png'], 'J-SA02' => [96,108,'png'], 'J-SH02' => [96,98,'png'] }, 'DDIPOCKET' => { 'AH-J3001V' => [128,160,'gif,png'], 'AH-J3002V' => [128,160,'gif,png'], 'AH-K3001V' => [240,320,'gif,png'], }, }; }