Perlのお勉強-#6。

 Image::Size では,サイズを変えるのは面倒そうというか,自分でGDを使っていろいろとやらなくてはいけないみたい。まだ,そんな力はない。XREAでは Image::Magick も使えるようなので,これを使ってみる。

 ちょっと注意が必要なのは,Image::Magickはハンドルではなくファイル名を扱うということがあって,ふーんと思っていたけど,PerlMagick APIを読むと使えないわけでもないらしい。確実性に欠けるのかな。

 ググっているときに見つけたどのスクリプトも何の説明もなく, $image = Image::Magick->new; みたいになっていてなんでだろうと思っていたんだが,PerlMagick APIの中に書き方が書いてあって,newそのものが,Image::Magickのメソッドの一つなんだね。

 ひとまず,画像の拡縮にだけ成功したので,今の時点のスクリプトをこんがらないように書いておく。

 今回,今時点でわからないことがひとつある。それは,umaskの件。mkdirのところでパーミッションの指定を0705にしてある。でさ,このサーバのumaskを調べると0022らしいのだが,にもかかわらず,mkdirで0705に設定したそのままで$dir2ができちゃう。mkdirで設定したパーミッションはその時点でのumaskの値の影響を受けると書いてあるから,変わらないとおかしいのではないかと思うんだが,なんか読み落としているのかなぁ。

 さて,スクリプト。今のところエラーチェックが全く入っていない。その辺,問題。

追記(02/21):使っていないFile::Basenameを消すのを忘れていた。

―html―のほう。

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html lang='ja'>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>画像サイズ変更</title>
</head>
<body>
<form action="bgm.cgiのURL" method="post" enctype="multipart/form-data">
<p>画像ファイル名:<input type="file" name="image" /></p>
<p><input type="submit" name="submit" value="送信" /></p>
</form>
</body>
</html>

―bgm.cgi―のほう。

#!/usr/bin/perl

use strict;
use warnings;

use CGI;
use File::Copy;
use Image::Magick;

#ドキュメントルート
my $path = $ENV{'DOCUMENT_ROOT'};

my $dir1 = '/bgm'; #ドキュメントルート直下に手動で作成
my $dir2 = 2; #生成ファイル関連№ ファイル名・フォルダ名
my $siz1 = 0.5; #1未満で縮小,1を超えると拡大
my $blr1 = 0.8; #鮮明度 小さいと鮮明に,大きいとぼやける

#引数格納変数
my $q = new CGI;

chdir("$path$dir1");
mkdir("$dir2" , 0705);

# 元画像ファイル
my $img1 = "$dir2.jpg"; #画像ファイル名
my $fh1 = $q->upload('image');
copy ($fh1, "$path$dir1/$dir2/$img1"); #サーバ上の絶対パスでないといけないようだ。

undef $q; #CGI Objectをundef。

# 画像保存先
my $img2 = "$dir2-s.jpg";

# オブジェクト作成
my $image = Image::Magick->new;

# 元画像読み込み
$image->Read("$path$dir1/$dir2/$img1");

# 元画像縦横サイズ取得
my ($img3, $img4) = $image->Get('width', 'height');

# サイズ変更
$image->Resize(width => int($img3 * $siz1), height => int($img4 * $siz1), blur => $blr1);

# 画像保存
$image->Write("$path$dir1/$dir2/$img2");

#HTML ヘッド出力
print "Content-type: text/html; charset=UTF-8n";
print "Status: 200 OKn";
print "n";

print <<"END";
<html>
<head>
<title>画像サイズ変更</title>
</head>
<body>
画像サイズ変更・保存しました。<br>
<br>
↓保存した画像<br>
<img src='$dir1/$dir2/$img2'><br>
<br>
↓元の画像<br>
<img src='$dir1/$dir2/$img1'><br>
</body>
</html>
END

#終了
exit(0);

Comments are closed.