ブログで趣味でプログラミングからお料理まで呟いています。よろしくー。(^-^)/


先月  2022年 11月  来月


1 2 3 4 5
6 7 8 9 10 11 12
13 14 1516 17 1819
20 21 22 23 24 25 26
27 28 29 30



文字サイズ変更:
トップページ > Perlについて

●Perlについて●

2022-11-15 21:39:12

Image::Magickを使うには



Image::Magickについて書きたいと思います。
ブラウザからアップロードされた画像を、Perl モジュール Image::Magick を使って CGI プログラム内で加工する方法の紹介です。

Image::Magickとは、ImageMagickという画像操作を行うものをPerlで扱う為の外部モジュールです。

具体的には、useして使います。

use Image::Magick;




* 画像のアップロードフォーム *
画像をアップロードする際に使用するフォームを紹介します。
ENCTYPE を「multipart/form-data」にする点を忘れないでください。

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>ファイルアップロード</title> </head> <body> <form method="post" action="image_resize.cgi" ENCTYPE="multipart/form-data"> 画像ファイル選択: <input type="file" name="img"> <input type="submit" value="アップロード"> </form> </body> </html>




画像変換をするCGI
画像変換をするプログラムは、CGI モジュール と Image::Magick モジュールを使い加工を行います。

Image::Magickは自サーバーの場合は、インストールする必要があります。
レンタルサーバーの場合は、ほぼインストールしてあると思います。
「use Image::Magick」で、エラーが出ないようなら、インストールしてあると思います。

[Image::Magic の使い方]

・設定パラメータは仕上がりを見ながら試行錯誤して設定する必要があります。
・Image::Magick のエラーは、CGI 内で起こると Internal Server Error を引き起こしてしまいますので、eval でトラップしながら処理を進めます。


その他、CGI でファイルを受け取るときの一般的な留意点は以下の通りです。

・ファイルサイズをチェックする(任意)
・ファイル拡張子で画像かどうかを事前チェック
・保存ディレクトリが重複しないように留意

#!/usr/bin/perlーー use strict; use Image::Magick; use CGI; binmode(STDOUT, ':utf8'); my $cgi = new CGI; my %in = &parse_form($cgi); # アップロードファイル取得 my $upfile = $in{'img'}; if($upfile ne '' || $upfile ne undef ){ # ファイル名と拡張子を取得 ($fname, $ext) = $upfile =~ /([^:/]+).(w+)$/ ? ($1, $2) : &error("アップファイル名が不正です", 'kanri'); # 受付可能な拡張子(正規表現) @ext_ok = ("gif", "jpeg", "jpg", "png"); unless (grep {$ext =~ /^$_$/i} @ext_ok){ #どれにも合致しなければ &error("許可されていない拡張子($ext)です。", 'kanri'); } # CGIオブジェクトを作成 $image = Image::Magick->new; eval{$ret1 = $image->Read(file=>$upfile)}; # 画像の幅、高さを取得する ($width, $height) = $image->Get('width', 'height'); $width = $width - 100; $height = $height - 100; # サイズを変更 $image->Scale(width=>$width, height=>$height); my $fname_min = "$img_dir$fname.$ext"; # 画像の書き込み eval{$ret2 = $image->Write($fname_min)}; } sub parse_form { my $cgi = shift; my %in; foreach ( $cgi->param ) { my $val = $cgi->param($_); # 無害化 if ($_ ne 'img') { $val =~ s/[ ]//g; $val =~ s/[ ]/<br>/g; } $in{$_} = $val; } return %in; }


上のCGIモジュールは、縦幅、横幅を-100したサイズに縮小して、サーバーにアップロードするモジュールです。
Image::Magick自体は、セピア調にしたり、文字を画像の中に入れたりと、様々できます。


出典「ミヤビッチの穴 Image::Magick の使い方
Print Twitter(test) short URL いいね:48

back to the TOP


PR (i)