#!/usr/bin/env perl #============================================================================== # < index.cgi > # # ◇ 機能 # ・ #------------------------------------------------------------------------------ # ◇ 使用法: # # # ◇ 例: # # # ◇ 引数 # (なし) # #------------------------------------------------------------------------------ # Ver.1.0 00/00/00 by K.Shiraishi # #============================================================================== #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # # I N I T I A L I Z E # #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #============================================================================== # ライブラリ読込み #------------------------------------------------------------------------------ use strict; use CGI qw(:standard); #use CGI::Carp qw(fatalsToBrowser); use Image::Magick; use Jcode; #use LWP::Simple; #use GD; #print "Content-type: text/html\n\n"; #============================================================================== # 初期定義 #------------------------------------------------------------------------------ my($debug) = ''; # CGI初期化 my %in; my($icnt, $procid); &init_cgi; # グローバル変数定義 my $TRUE = (1 == 1); my $FALSE = (1 == 0); my $wrkdir = "/tmp/mb"; my $wrkdir = "/home/wwclient/webdo.co.jp/release/webdo_public/uts/mb/tmp2"; my $wrkurl = "/uts/mb/tmp2"; my $path_convert = "/usr/bin/convert"; my $path_convert = "/usr/X11R6/bin/convert"; my $name_img_banner = "bn$procid.$icnt.jpg"; my $name_img_uploaded = "up$procid.jpg"; my $name_img_main = "ma$procid.$icnt.jpg"; my $prev_img_banner = "$wrkdir/bn$procid.$in{icnt}.jpg"; my $prev_img_main = "$wrkdir/ma$procid.$in{icnt}.jpg"; my $file_img_banner = "$wrkdir/$name_img_banner"; my $file_img_uploaded = "$wrkdir/$name_img_uploaded"; my $file_img_main = "$wrkdir/$name_img_main"; my $url_img_banner = "$wrkurl/$name_img_banner"; my $url_img_uploaded = "$wrkurl/$name_img_uploaded"; my $url_img_main = "$wrkurl/$name_img_main"; my $url_self = "/uts/mb/"; my $file_debug = "$wrkdir/debug"; my $def_banw = 200; my $max_banw = 400; my $min_banw = 20; my $def_banh = 40; my $max_banh = 200; my $min_banh = 20; my @list_banner_size = ( "user|ユーザ指定", "88x31|88 x 31", "120x90|120 x 90", "120x60|120 x 60", "125x125|125 x 125", "234x60|234 x 60", "400x60|400 x 60" ); my(@img) = (); my(@iparam) = (); my($image_banner, $image_main, $banner_w, $banner_h, $img_filename); #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # # M A I N R O U T I N E # #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ &init; &main; exit 0; #============================================================================== # メイン関数 #------------------------------------------------------------------------------ sub main { # ワークディレクトリ作成 &init_wrkdir; &remove_old_files; # バナーサイズ取得 ($banner_w, $banner_h) = &get_banner_size; unlink( $prev_img_banner ) if (-f $prev_img_banner); unlink( $prev_img_main ) if (-f $prev_img_main); # 画像が今回アップロード指定されていれば保存 #&store_uploaded_image if ($in{upload}); &store_uploaded_image if ($in{image}); # アップロード画像決定 $image_main = &get_image_main; # バナー画像作成&保存 $image_banner = &get_image_banner; # ページ出力 # $debug .= "
" . `env` . "
"; $debug = qq!
$debug
!; $debug = ''; &put_html_all; } #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # # S U B R O U T I N E S # #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #============================================================================== # 初期設定 #------------------------------------------------------------------------------ sub init { } #============================================================================== # CGI 初期化 #------------------------------------------------------------------------------ sub init_cgi { %in = (); foreach (param) { my $t = param( $_ ); #$debug .= "($_:$t) "; if (! /^string\d$/) { $t =~ s/[^0-9A-Za-z_:\/\%\.\-\*\#]//g; $t =~ s/\.\.//; } $in{$_} = $t; } $icnt = $in{icnt} + 1; $procid = ($in{procid}) ? $in{procid} : $$; $in{banner_size} = '234x60' if (! $in{banner_size}); } #============================================================================== # ページ表示 #------------------------------------------------------------------------------ sub put_html_all { #&PrintHeader(); print header(-type => 'text/html', -charset => 'x-euc-jp'); &put_html_head; if (! $in{expert_mode}) { &put_html_beginer_mode; } else { &put_html_expert_mode; } } #============================================================================== # 古いファイルを削除 #------------------------------------------------------------------------------ sub remove_old_files { my @files = split( /\n/, `find $wrkdir -mtime +1 -print` ); $debug .= "(find $wrkdir -mtime +1 -print)\n"; foreach my $f (@files) { $debug .= "($f)
"; next if ($f =~ /^\./); chmod( 0666, $f ); unlink( $f ); } } #============================================================================== # 共通 HTML ヘッダ表示 #------------------------------------------------------------------------------ sub put_html_head { print < 楽ばな 〜無料で使えるバナー作成ツール〜 EOT } #============================================================================== # 初心者用 HTML 表示 #------------------------------------------------------------------------------ sub put_html_beginer_banner { # 未使用!!! print <
バナー画像
$image_banner (20-400)
(20-200)
$debug EOT } sub put_html_beginer_mode { print <
楽ばな 〜 無料で使えるバナー作成ツール 〜

EOT &put_chara_form( 1 ); &put_chara_form( 2 ); &put_chara_form( 3 ); print < EOT my $dummy = <
EOT #
#もっと色々設定したい!という方は→ #上級者版をどうぞ! #
#
print <
1. まずは、バナーのサイズを決めましょう。
バナー画像
$image_banner (20-400)
(20-200)
  
2. 次に、お手持ちの画像をアップロードします。
画像選択   
3. 画像の切り取り範囲を決めます。
メイン画像
$image_main 切り取りの開始点
(切り取る部分の左上)

  



切り取り幅
(高さは自動)



効果
EOT &put_select( 1, 'effect', '|---', 'darken|暗くする', 'lighten|明るくする', 'blur|ぼかす', 'raise|浮き上がらせる' ); # 'implode|中心に引き込む', # 'oilpaint|油絵っぽくする', &put_select( 1, 'efflev', '0|弱', '1|中', '2|強' ); # print <


4. 挿入する文字列と、見栄えや位置を決めます。
5. とりあえず完成です!
$image_banner
役立つ情報色々〜無料で作れるオリジナルトップバナー〜


画像の保存方法
バナー画像はいつでも保存できます。
上のバナー画像を右クリックし、「対象をファイルに保存...」などを選んで、画像を保存して下さい。

上部1.〜4.のそれぞれの項目を変更することもできます。

6. 装飾するアクセサリ画像と、位置を決めます。
アクセサリ画像 EOT print <
貼り付け位置: 左 上

対応ブラウザは、Internet Explorer 4.0以上です。

「楽バナ」は原則リンクフリーです。ロゴを利用したリンクをご希望の方は、下記のロゴを右クリック->画像の保存でご利用くださいね。
楽ばな 〜 無料で使えるバナー作成ツール 〜 楽ばな 〜 無料で使えるバナー作成ツール 〜 楽ばな 〜 無料で使えるバナー作成ツール 〜
(148px x 60px)
リンク先URL->http://webdo.co.jp/uts/mb/
$debug
EOT } sub put_chara_form { my($num) = shift; my($string) = "string" . $num; my($fgcolor) = "fgcolor" . $num; my($bdcolor) = "bdcolor" . $num; my($ftsize) = "ftsize" . $num; my($align) = "align" . $num; my($valign) = "valign" . $num; my($str_x) = "str_x" . $num; my($str_y) = "str_y" . $num; my($font) = "font" . $num; my @list_align = ( "0|左揃え", "1|中揃え", "2|右揃え" ); my @list_valign = ( "0|上揃え", "1|中揃え", "2|下揃え" ); my @list_font = ( "1.TTF|標準", "2.TTF|太字", "3.TTC|太字2", "4.TTF|丸文字", "5.TTF|筆文字" ); my @list_ftsize = ( "8|8", "10|10", "12|12", "14|14", "16|16", "18|18", "20|20", "24|24", "28|28", "32|32", "36|36" ); my @list_color = ( "black|黒", "blue|青", "red|赤", "purple|紫", "green|緑", "cyan|水色", "yellow|黄色", "white|白", "#000088|暗い青", "#880000|暗い赤", "#880088|暗い紫", "#008800|暗い緑", "#008888|暗い水色", "#888800|暗い黄色", "#888888|灰色", ); my @list_color2 = ( "|なし" ); push( @list_color2, @list_color ); print <文字列$num
  文字色: EOT &put_select( 0, $bdcolor, @list_color2 ); print < サイズ: EOT &put_select( 0, $font, @list_font ); print < 配置:横 EOT &put_select( 0, $valign, @list_valign ); print < 移動:横  縦 EOT print qq!  ! if ($num == 3); print <
EOT } sub put_html_beginer_mode_old { print <



EOT #
#もっと色々設定したい!という方は→ #上級者版をどうぞ! #
#
print <
1. まずは、バナーのサイズを決めましょう。
バナー画像
$image_banner (20-400)
(20-200)
2. 次に、お手持ちの画像をアップロードします。
画像選択
3. 画像の切り取り範囲を決めます。
メイン画像
$image_main
切り取りの開始点
(切り取る部分の左上の座標)





切り取り幅
(切り取る部分の横幅、縦は自動)



効果
EOT &put_select( 1, 'effect', '|---', 'darken|暗くする', 'blur|ぼかす', 'spread|ざらざらにする', 'frame|枠をつける', ); # print <


4. 挿入する文字列と、位置を決めます。
挿入する文字列
文字列   影を付ける
文字色 文字: 枠:
文字サイズ pt (小数可)
配置 横方向   縦方向 
位置 左 px  上 px (中揃えの場合は無効)

5. とりあえず完成です!

バナー画像はいつでも保存できます。

画像の保存方法
上の「バナー画像」欄の画像を右クリックし、「対象をファイルに保存...」などを選んで、画像を保存して下さい。

装飾をつける場合は、次の手順に進みます。
前のそれぞれの項目を変更することもできます。

6. 装飾するアクセサリ画像と、位置を決めます。
アクセサリ画像
貼り付け位置: 左 上

$debug EOT } #============================================================================== # 上級者用 HTML 表示 #------------------------------------------------------------------------------ sub put_html_expert_mode { print <

サンプル版



とりあえずカンタンに作りたい!という方は→ お手軽版をどうぞ!

バナー画像
$image_banner

メイン画像
$image_main
画像全体を使用     縦 (出力サイズ)
割合で指定 (%) ピクセル値指定 (px)
※ 横又は縦のみを指定した場合は自動設定
画像の一部を使用 px 縦px の位置から(左上始点)
px 縦px 分を(切取範囲)
px 縦px で出力(出力サイズ)
画像選択
アクセサリ画像      ※ 貼り付け位置: 横px 縦px
挿入する文字列
文字列   影を付ける
文字色# 
文字サイズ pt (小数可)
配置設定 横方向   縦方向 
余白調整 横方向 px  縦方向 px (中揃えの場合は無効)
フォント
出力形式  ※JPG形式で出力時の保存品質  % (上限100)
インターレース化する
処理中に256色を越えた場合は近似色を探して処理を続ける
文字が画像をはみ出しても処理を続ける
EOT } #&PrintFooter(); #============================================================================== # HTML ヘッダ表示 #------------------------------------------------------------------------------ sub PrintHeader { my(%arg_prm) = @_; my(%prm) = ( -lang => 'japanese', -title => 'KEGG DEV.', -head=>meta({ -http_equiv => 'Content-Type', -content => 'text/html; charset=x-euc-jp', -style => '/css/user.css' }), -BGCOLOR => '#ffffff' ); my($p); # 入力パラメータがあれば、デフォルトを上書き foreach $p (keys %arg_prm) { $prm{$p} = $arg_prm{$p}; } print header(-type => 'text/html', -charset => 'x-euc-jp'); print start_html( %prm ); } #============================================================================== # HTML フッタ表示 #------------------------------------------------------------------------------ sub PrintFooter { print end_html; } #============================================================================== # ワークディレクトリ設定 #------------------------------------------------------------------------------ sub init_wrkdir { mkdir( $wrkdir, 0777 ) if (! -d "$wrkdir"); chmod( 0777, $wrkdir ); } #============================================================================== # バナーサイズ決定 #------------------------------------------------------------------------------ sub get_banner_size { my($w, $h); $w = $in{banner_w}; $h = $in{banner_h}; if ($in{banner_size} eq 'user') { foreach my $s (@list_banner_size) { my($sw, $sh); next if ($s !~ /^(\d{2,3})x(\d{2,3})$/); if ($w == $1 && $h == $2) { $in{banner_size} = $s; } } } if ($in{banner_size} =~ /^(\d{2,3})x(\d{2,3})$/) { ($w, $h) = ($1, $2); } $w = $min_banw if ($w < $min_banw); $w = $max_banw if ($w > $max_banw); $h = $min_banh if ($h < $min_banh); $h = $max_banh if ($h > $max_banh); $in{banner_w} = $w; $in{banner_h} = $h; ($w, $h); } #============================================================================== # アップロード指定された画像を保存 #------------------------------------------------------------------------------ sub store_uploaded_image { my( $img, $buffer, $file_img_tmp, $size, $suffix ); $img = param( 'image' ); $img_filename = $img; ($suffix) = ($img =~ /\.(\w+)$/); $file_img_tmp = "$file_img_uploaded.tmp.$suffix"; $size = 0; if (open( OUTFILE, ">>$file_img_tmp" ) ) { while( my $bytesread = read( $img, $buffer, 1024 ) ) { print OUTFILE $buffer; $size += 1024; last if ($size > 5000000); # ~5MB } } close( OUTFILE ); chmod( 0666, $file_img_tmp ); $debug .= `ls -l $file_img_tmp`; # &img_init( 2, $file_img_tmp ); # バナー画像(#2)を初期化 # $img[2]->Resize( geometry=>'400x400>' ); # &img_out( 2, $file_img_uploaded ); # バナー画像として一旦保存 system( "$path_convert -resize '400x400>' $file_img_tmp $file_img_uploaded" ); # $debug .= `which convert`; unlink( $file_img_tmp ); } #============================================================================== # メイン画像決定 #------------------------------------------------------------------------------ sub get_image_main { my ($is_param_valid) = $TRUE; my ($x, $y, $w) = ($in{'clip_x'}, $in{'clip_y'}, $in{'clip_w'}); my ($h) = int( $w / $banner_w * $banner_h ); my ($ret) = ''; # 範囲が有効でない場合、アップロード画像をそのまま返す。 $is_param_valid = $FALSE if (! $w); if (! -f $file_img_uploaded) { $ret = &get_main_noimage; return $ret; } #system( 'chmod 666 /tmp/mb/*; rm /tmp/mb/*' ); if ($x && $y && !$w) { # 始点のみ入っている場合は、始点のマーカを表示する。 # &img_init( 1, $file_img_uploaded ); # メイン画像(#1)を初期化 # &i_mark( 1, $x, $y ); # 枠を書く # &img_out( 1, $file_img_main ); # メイン画像として出力 &cimg_init( 1, $file_img_uploaded ); # メイン画像(#1)を初期化 &cimg_add( 1, &ci_mark( $x, $y ) ); # 枠を書く &cimg_out( 1, $file_img_main ); # メイン画像として出力 $ret=qq!
!; } #============================================================================== # バナー画像作成&保存 #------------------------------------------------------------------------------ sub get_image_banner { my ($is_param_valid) = $TRUE; my ($x, $y, $w) = ($in{clip_x}, $in{clip_y}, $in{clip_w}); my ($h); #print "$debug"; exit 0; # 範囲に何も入っていなくて画像がアップロードされている場合、左上の等倍画像を返す。 if (!$in{clip_x} && !$in{clip_y} && !$in{clip_w} && -f $file_img_uploaded) { $in{clip_x} = $in{clip_y} = 0; $in{clip_w} = $banner_w; ($x, $y, $w) = (0, 0, $banner_w); # メイン画像再読込 $image_main = &get_image_main; } # 範囲が有効でない場合、灰色の枠を返す。 $is_param_valid = $FALSE if (! $w || ($banner_w * $banner_h == 0) || ! -f $file_img_uploaded); return &get_banner_noimage if (! $is_param_valid); $h = int( $w / $banner_w * $banner_h ); # &img_init( 2, $file_img_uploaded ); # バナー画像(#2)を初期化 # &i_clip( 2, $x, $y, $w, $h ); # アップロード画像を切り取る # &i_resize( 2, $banner_w, $banner_h ); # 画像のリサイズ # &img_out( 2, $file_img_banner ); # バナー画像として一旦保存 # &img_init( 2, $file_img_banner ); # 再読込 # &i_effect( 2, $in{effect}, $in{efflev} ) if ($in{effect}); # &i_write( 2, $in{string1}, $in{fgcolor1}, $in{bdcolor1}, $in{ftsize1}, $in{str_x1}, $in{str_y1}, $in{align1}, $in{valign1}, $in{font1} ) if ($in{string1}); # &i_write( 2, $in{string2}, $in{fgcolor2}, $in{bdcolor2}, $in{ftsize2}, $in{str_x2}, $in{str_y2}, $in{align2}, $in{valign2}, $in{font2} ) if ($in{string2}); # &i_write( 2, $in{string3}, $in{fgcolor3}, $in{bdcolor3}, $in{ftsize3}, $in{str_x3}, $in{str_y3}, $in{align3}, $in{valign3}, $in{font3} ) if ($in{string3}); # &img_out( 2, $file_img_banner ); # バナー画像として出力 &cimg_init( 2, $file_img_uploaded ); # バナー画像(#2)を初期化 &cimg_add( 2, &ci_clip( $x, $y, $w, $h ) ); # アップロード画像を切り取る &cimg_add( 2, &ci_resize( $banner_w, $banner_h ) ); # 画像のリサイズ &cimg_add( 2, &ci_effect( $in{effect}, $in{efflev} ) ) if ($in{effect}); # &cimg_add( 2, &ci_write( $in{string1}, $in{fgcolor1}, $in{bdcolor1}, $in{ftsize1}, $in{str_x1}, $in{str_y1} ) ); # 文字を重ねる &cimg_add( 2, &ci_write( $in{string1}, $in{fgcolor1}, $in{bdcolor1}, $in{ftsize1}, $in{str_x1}, $in{str_y1}, $in{align1}, $in{valign1}, $in{font1} ) ) if ($in{string1}); &cimg_add( 2, &ci_write( $in{string2}, $in{fgcolor2}, $in{bdcolor2}, $in{ftsize2}, $in{str_x2}, $in{str_y2}, $in{align2}, $in{valign2}, $in{font2} ) ) if ($in{string2}); &cimg_add( 2, &ci_write( $in{string3}, $in{fgcolor3}, $in{bdcolor3}, $in{ftsize3}, $in{str_x3}, $in{str_y3}, $in{align3}, $in{valign3}, $in{font3} ) ) if ($in{string3}); &cimg_out( 2, $file_img_banner ); # バナー画像として出力 return qq!!; } sub get_banner_noimage { return qq!

!; } #============================================================================== # 画像準備 (PerlMagick用) #------------------------------------------------------------------------------ # 画像のイニシャライズ sub img_init { my $num = shift; my $file = shift; $img[$num] = Image::Magick->new; # 画像読み込み $img[$num]->Read( $file ); } # 画像パラメータの追加 sub img_add { } #============================================================================== # 画像効果 (PerlMagick用) #------------------------------------------------------------------------------ # 切り取り範囲を表示する sub i_border { my $num = shift; my($x0, $y0, $w, $h) = @_; my($x1, $y1) = ($x0 + $w, $y0 + $h); # $img[$num]->MogrifyRegion( "${w}x${h}+${x0}+${y0}", 'colorize', opacity=>'50/50/20' ); $img[$num]->MogrifyRegion( "${w}x${h}+${x0}+${y0}", 'modulate', brightness=>50, saturation=>100, hue=>120 ); #qq!-fill blue -draw "rectangle Over ${x0},${y0} ${x1},${y1}"!; #qq!-colorize 50/50/20 -region ${w}x${h}+${x0}+${y0}!; qq!-region ${w}x${h}+${x0}+${y0} -colorize 50/50/20!; } # マーカをつける sub i_mark { my $num = shift; my($x, $y) = @_; my($s1) = 7; my($s2) = 3; my($x1) = $x - $s1; my($x2) = $x + $s1; my($y1) = $y - $s1; my($y2) = $y + $s1; my($p1) = sprintf( "%d,%d %d,%d", $x-1, $y1-1, $x+1, $y2+1 ); my($p2) = sprintf( "%d,%d %d,%d", $x1-1, $y-1, $x2+1, $y+1 ); # $img[$num]->Draw( primitive=>'rectangle', ); $img[$num]->Draw( primitive=>'rectangle', points=>$p1, stroke=>"#ffffff", fill=>"#000000", strokewidth=>1 ); $img[$num]->Draw( primitive=>'rectangle', points=>$p2, stroke=>"#ffffff", fill=>"#000000", strokewidth=>1 ); } # 画像を切り取る sub i_clip { my $num = shift; my($x0, $y0, $w, $h) = @_; my($x1, $y1) = ($x0 + $w, $y0 + $h); $img[$num]->Crop( width=>$w, height=>$h, x=>$x0, y=>$y0 ); #qq!-size ${w}x${h} -crop ${w}x${h}+${x0}+${y0}!; qq!-crop ${w}x${h}+${x0}+${y0}!; } # 画像をリサイズ sub i_resize { my $num = shift; my($w, $h) = @_; $img[$num]->Resize( width=>$w, height=>$h ); "-resize '${w}x${h}!'"; } # 文字を書く sub i_write { my($num, $str, $fg, $bd, $size, $x, $y, $al, $val, $ft) = @_; my(@grav) = qw(NorthWest North NorthEast West Center East SouthWest South SouthEast); my($gr); my($ret) = ''; my(@param) = (); # return '' if (! $str); $x = 0 if (! $x || $x < 0); $y = 0 if (! $y || $y < 0); #$debug .= "($num, $str, $fg, $bd, $size, $x, $y, $al, $val, $ft:$in{font1}, )\n"; $str = jcode($str)->utf8; $al = 0 if ($al < 0 || $al > 2); $val = 0 if ($val < 0 || $val > 2); $gr = $grav[$val * 3 + $al]; # $img[$num]->Annotate( text=>$str, fill=>$fg, pointsize=>$size, x=>$x, y=>$y, font=>"FONT$ft", gravity=>$gr, weight=>300, antialias=>'true', encoding=>'UTF-8' ); push( @param, (text=>$str, fill=>$fg, pointsize=>$size, x=>$x, y=>$y, font=>"FONT$ft", gravity=>$gr, weight=>300, antialias=>'true', encoding=>'UTF-8') ); push( @param, stroke=>$bd ) if ($bd); $img[$num]->Annotate( @param ); # $img[$num]->Annotate( text=>$str, fill=>$fg, stroke=>$bd, pointsize=>$size, x=>$x, y=>$y, font=>'/home/Kotaro/www/tools/mb/times.ttf', encoding=>'UTF-8' ); #$img[$num]->Annotate(text=>'HELLO', stroke=>'#FFFFFF', fill=>'#005599', pointsize=>'36', x=>'20', y=>'40', encoding=>'UTF-8'); $ret .= " -pointsize $size" if ($size); $ret .= " -fill '$fg'" if ($fg); $ret .= " -stroke '$bd'" if ($bd); $ret .= qq! -draw "text $x,$y '$str'"!; $ret =~ s/^ //; $ret; } # 効果を加える sub i_effect { my $num = shift; my($e, $lv) = @_; my($ret) = ''; if ($e eq 'blur') { if ($lv == 0) { $img[$num]->Blur( radius=>2, sigma=>2 ); } if ($lv == 1) { $img[$num]->Blur( radius=>5, sigma=>3 ); } if ($lv == 2) { $img[$num]->Blur( radius=>8, sigma=>4 ); } } elsif ($e eq 'darken') { if ($lv == 0) { $img[$num]->Modulate( brightness=>80, saturation=>100, hue=>100 ); } if ($lv == 1) { $img[$num]->Modulate( brightness=>60, saturation=>100, hue=>100 ); } if ($lv == 2) { $img[$num]->Modulate( brightness=>40, saturation=>100, hue=>100 ); } } elsif ($e eq 'lighten') { if ($lv == 0) { $img[$num]->Modulate( brightness=>120, saturation=>100, hue=>100 ); } if ($lv == 1) { $img[$num]->Modulate( brightness=>140, saturation=>100, hue=>100 ); } if ($lv == 2) { $img[$num]->Modulate( brightness=>160, saturation=>100, hue=>100 ); } } elsif ($e eq 'implode') { if ($lv == 0) { $img[$num]->Implode( amount=>0.2 ); } if ($lv == 1) { $img[$num]->Implode( amount=>0.5 ); } if ($lv == 2) { $img[$num]->Implode( amount=>1.0 ); } } elsif ($e eq 'oilpaint') { if ($lv == 0) { $img[$num]->OilPaint( radius=>1 ); } if ($lv == 1) { $img[$num]->OilPaint( radius=>3 ); } if ($lv == 2) { $img[$num]->OilPaint( radius=>5 ); } } elsif ($e eq 'raise') { if ($lv == 0) { $img[$num]->Raise( width=>4, height=>4, raise=>'True' ); } if ($lv == 1) { $img[$num]->Raise( width=>7, height=>7, raise=>'True' ); } if ($lv == 2) { $img[$num]->Raise( width=>10, height=>10, raise=>'True' ); } } if ($e eq 'blur') { $ret = qq!-blur 2x2!; } # elsif ($e eq 'lighten') { $ret = qq!-colorize -50/-50/-50!; } elsif ($e eq 'darken') { $ret = qq!-colorize 50/50/50!; } elsif ($e eq 'spread') { $ret = qq!-spread 2!; } elsif ($e eq 'frame') { $ret = qq!-frame 10x10+3+3!; } #&dbg( "($e,$in{effect})\n" ); $ret; } #============================================================================== # 画像生成 (PerlMagick用) #------------------------------------------------------------------------------ sub img_out { my $num = shift; my $file = shift; $img[$num]->Write( $file ); # undef $$img; } #============================================================================== # 画像準備 (convert用) #------------------------------------------------------------------------------ # 画像のイニシャライズ sub cimg_init { my $num = shift; my $file = shift; $iparam[$num][0] = $file; } # 画像パラメータの追加 sub cimg_add { my $num = shift; my $prm = shift; push( @{$iparam[$num]}, $prm ); } #============================================================================== # 画像生成 (convert用) #------------------------------------------------------------------------------ sub cimg_out { my $num = shift; my $file = shift; my $com = "$path_convert"; foreach my $p (@{$iparam[$num]}) { $com .= " $p"; } $com .= " $file"; &dbg( $com ); system( $com ); } #============================================================================== # 画像効果 (convert用) #------------------------------------------------------------------------------ # 枠を描く sub ci_border { my($x0, $y0, $w, $h) = @_; my($x1, $y1) = ($x0 + $w, $y0 + $h); # qq!-fill blue -draw "rectangle Over ${x0},${y0} ${x1},${y1}"!; # qq!-colorize 50/50/20 -region ${w}x${h}+${x0}+${y0}!; qq!-region ${w}x${h}+${x0}+${y0} -colorize 50/50/20!; } # マーカをつける sub ci_mark { my($x, $y) = @_; my($s1) = 7; my($s2) = 3; my($x1) = $x - $s1; my($x2) = $x + $s1; my($y1) = $y - $s1; my($y2) = $y + $s1; my($p1) = sprintf( "%d,%d %d,%d", $x-1, $y1-1, $x+1, $y2+1 ); my($p2) = sprintf( "%d,%d %d,%d", $x1-1, $y-1, $x2+1, $y+1 ); # $img[$num]->Draw( primitive=>'rectangle', points=>$p1, stroke=>"#ffffff", fill=>"#000000", strokewidth=>1 ); # $img[$num]->Draw( primitive=>'rectangle', points=>$p2, stroke=>"#ffffff", fill=>"#000000", strokewidth=>1 ); qq!-strokewidth 1 -stroke "#ffffff" -fill "#000000" -draw "rectangle $p1 rectangle $p2"!; } # 画像を切り取る sub ci_clip { my($x0, $y0, $w, $h) = @_; my($x1, $y1) = ($x0 + $w, $y0 + $h); # qq!-size ${w}x${h} -crop ${w}x${h}+${x0}+${y0}!; qq!-crop ${w}x${h}+${x0}+${y0}!; } # 画像をリサイズ sub ci_resize { my($w, $h) = @_; "-resize '${w}x${h}!'"; } # 文字を書く sub ci_write { my($str, $fg, $bd, $size, $x, $y, $al, $val, $ft) = @_; my(@grav) = qw(NorthWest North NorthEast West Center East SouthWest South SouthEast); my($gr); my($ret) = ''; my(@param) = (); return '' if (! $str); $x = 0 if (! $x || $x < 0); $y = 0 if (! $y || $y < 0); #$debug .= "($num, $str, $fg, $bd, $size, $x, $y, $al, $val, $ft:$in{font1}, )\n"; $str = jcode($str)->utf8; $al = 0 if ($al < 0 || $al > 2); $val = 0 if ($val < 0 || $val > 2); $gr = $grav[$val * 3 + $al]; # $img[$num]->Annotate( text=>$str, fill=>$fg, pointsize=>$size, x=>$x, y=>$y, font=>"FONT$ft", gravity=>$gr, weight=>300, antialias=>'true', encoding=>'UTF-8' ); # push( @param, (text=>$str, fill=>$fg, pointsize=>$size, x=>$x, y=>$y, font=>"FONT$ft", gravity=>$gr, weight=>300, antialias=>'true', encoding=>'UTF-8') ); # push( @param, stroke=>$bd ) if ($bd); # $img[$num]->Annotate( @param ); # $img[$num]->Annotate( text=>$str, fill=>$fg, stroke=>$bd, pointsize=>$size, x=>$x, y=>$y, font=>'/home/Kotaro/www/tools/mb/times.ttf', encoding=>'UTF-8' ); #$img[$num]->Annotate(text=>'HELLO', stroke=>'#FFFFFF', fill=>'#005599', pointsize=>'36', x=>'20', y=>'40', encoding=>'UTF-8'); $ret .= " -pointsize $size" if ($size); $ret .= " -fill '$fg'" if ($fg); $ret .= " -stroke "; $ret .= ($bd) ? "'$bd'" : 'none'; $ret .= qq! -encoding UTF-8 -font "FONT$ft" -draw "gravity $gr text $x,$y '$str'"!; $ret =~ s/^ //; $debug .= "($ret)\n"; $ret; } # 効果を加える sub ci_effect { my($e) = @_; my($ret) = ''; my($e, $lv) = @_; my($ret) = ''; if ($e eq 'blur') { if ($lv == 0) { $ret = qq!-blur 2x2!; } if ($lv == 1) { $ret = qq!-blur 5x3!; } if ($lv == 2) { $ret = qq!-blur 8x4!; } } elsif ($e eq 'darken') { if ($lv == 0) { $ret = qq!-modulate 80,100,100!; } if ($lv == 1) { $ret = qq!-modulate 60,100,100!; } if ($lv == 2) { $ret = qq!-modulate 40,100,100!; } } elsif ($e eq 'lighten') { if ($lv == 0) { $ret = qq!-modulate 120,100,100!; } if ($lv == 1) { $ret = qq!-modulate 140,100,100!; } if ($lv == 2) { $ret = qq!-modulate 160,100,100!; } } elsif ($e eq 'implode') { if ($lv == 0) { $ret = qq!-implode 0.2!; } if ($lv == 1) { $ret = qq!-implode 0.5!; } if ($lv == 2) { $ret = qq!-implode 1.0!; } } elsif ($e eq 'oilpaint') { # if ($lv == 0) { $img[$num]->OilPaint( radius=>1 ); } # if ($lv == 1) { $img[$num]->OilPaint( radius=>3 ); } # if ($lv == 2) { $img[$num]->OilPaint( radius=>5 ); } } elsif ($e eq 'raise') { if ($lv == 0) { $ret = qq!-raise 4x4!; } if ($lv == 1) { $ret = qq!-raise 7x7!; } if ($lv == 2) { $ret = qq!-raise 10x10!; } } #&dbg( "($e,$in{effect)\n" ); $ret; } #============================================================================== # リストボックス表示(selected自動付加) #------------------------------------------------------------------------------ sub put_select { my($select_tag, $name, @list) = @_; my($sel) = $in{$name}; print qq!\n! if ($select_tag); } #============================================================================== # デバグ #------------------------------------------------------------------------------ sub dbg { my($msg) = $_[0]; my($dt) = `date '+%y%m%d.%H%M%S'`; chomp $dt; if (open( DBG, ">>$file_debug" )) { print DBG "$dt\t$ENV{SERVER_ADDR}\t$msg\n"; close( DBG ); } } __END__ #============================================================================== # #------------------------------------------------------------------------------ #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # # A P P E N D I X # #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ ◇ : : :