Perl で、画像のサムネイルを作成してブラウザから表示させる方法

以下のサンプルファイルを image.cgi と名前を付けて保存、アクセス権を chmod +x image.cgi とかして ブラウザから https://yourname.com/image.cgi とかにアクセスすればよい。 注意点としては、このスクリプトは画像しか表示できないことである。これと一緒に HTML ファイルを表示しようと思っても、HTTP プロトコルの仕様上不可能である。なぜかというと HTTP プロトコルを通して画像を表示する場合は、すでにこのスクリプトが HTTP ヘッダとして Content-type: image/jpeg を最初に出力してブラウザが受け取っているからで、このスクリプトの中で同時に(画像を表示した後に) HTML 文書を表示させようとて Content-type: text/html を出力(print "Content-type: text/html\n\n)してもブラウザは受け付けてくれないのである。
#!/usr/bin/perl

use GD;

our $THUMBNAIL_SIZE_WIDTH  = 120; # サムネイルのサイズ(ピクセル/横)
# →縦サイズは横サイズに合わせて自動計算 120ピクセルを横にした場合、
# 640 x 480 の画像は横縦の比が 4:3 だから
# サムネイルの 横 x 縦の サイズは 120 x 90 となる。

our $MIMETYPE   =  'image/jpeg';
our $IMAGE_FILE =  'your_image.jpg';

&display_thumbnail($IMAGE_FILE);
# ↑ここを &display_original($IMAGE_FILE) に変えるとオリジナルイメージのまま表示

sub display_thumbnail  {

  my  $file =  shift;

  open (OBJECT, $file) || die "cannot open $file\n";
  $original_image = newFromJpeg GD::Image(\*OBJECT)
  || "Cannot make an original image object\n";

  my  @bound = $original_image->getBounds();
  my  $width  =  $THUMBNAIL_SIZE_WIDTH;
  my  $height =  $THUMBNAIL_SIZE_WIDTH * $bound[1] / $bound[0];

  $new_image = new GD::Image($width, $height)
  || die "cannot make a new image object\n";

  $new_image->copyResized(
                $original_image,
                0,
                0,
                0,
                0,
                $width,
                $height,
                $bound[0],
                $bound[1] 
              );

  print "Content-type: $MIMETYPE\n\n";
  binmode (*new_image);
  print $new_image->jpeg;
  close(OBJECT);
}

sub display_original {

  my  $file  = shift;

  open (OBJECT, $file) || die "cannot open $file\n";
  $object = newFromJpeg GD::Image(\*OBJECT)
  || "Cannot make an original image object\n";
 
  print "Content-type: $MIMETYPE\n\n";
  binmode ($object);
  print $object;
  close(OBJECT);
}

1;
・・・と、ここで気がついたのだが、このブログの第1回目のエントリーは、Perl で、JPEG の画像を扱う方法であった。このエントリーを見返すと、ウェブでの JPEG 画像の表示は、以下のサンプルを参考に、宿題として考えてみて欲しい。なんてエラソーなことが書いてあった。宿題にしていたことを自分でもすっかり忘れていたけど偶然このエントリーがフォローしたということ。結果オーライなのだ!(笑)
トラックバック URL: https://perltips.twinkle.cc/trackback/276
from Perl Tips on 2007/12/04(火) 07:39
間違いがありますよ
display_thumbnail の my $IMAGE_FILE = shift; は my $file =shift; のケアレスミスですね。 ご報告まで。use strictするとハッピーになれるかも。 おまけ) 出力を比較したかったら、こうやればいいのでは? use CGI; my $q = new CGI; my $mode = $q -> param('mode'); if(!$mode){ print $q -> header; #いいかげんなHTML print <<HTML <html> <head></head> <body> <img src ="./this.cgi?mode=1"> <br /> <img src ="./this.cgi?mode=2"> </body> </html> HTML } elsif($mode == 1){ display_thumbnail($IMAGE_FILE); } else{ display_oririnal($IMAGE_FILE); }
Posted by 匿名さん on 2008/10/09(木) 04:40
すみません、
ご指摘どうもありがとうございました。修正しました。
Posted by yas on 2008/11/19(水) 08:42
改行が
有効になっていないので読みにくくてすみません。
Posted by 匿名さん on 2008/10/09(木) 04:42