簡易画像変換+圧縮スクリプト

phpでつくってみました

自分用に作ったものですので(処理やその解説も含め)相当に甘いところやつまらないところがあると思いますが、お叱りを受けるためのたたき台として公開します⇒[お叱りフォーム]。 きちんと動くのは確認していますが、セキュリティ面などに不安がありますので必ず外部からのアクセスがない環境でどうぞ。

概要と機能::gif表示ができない環境(vodafoneケータイ)でも画像を見たいという願望から作られました。 機能としては 1)gifをpngに変換して表示 2)指定サイズ以下まで圧縮するのでパケ代も節約可能 3)phpでGDライブラリを利用しているうえスクリプト自体が2KB以下なので比較的サクサク動く などなど。 その他の点については管理人近況(10/23)へどうぞ。

改良の余地としては 1)画像のサイズもトリミング/リサイズできるようにすれば携帯の待ちうけ画像生成もリアルタイムで実現 2)画像の合成を利用すればサイトロゴを入れたサムネイルも簡単に作成可能 3)(俺clap!などでは既に利用していますが)文字入れも組み合わせればユーザーごとの会員証画像(昔で言うナメ猫運転免許証/いまならもうちょっと応用してQRコード)を作れたり などなど。まぁそのあたりはご自分で!

<?php //php画像変換+圧縮スクリプト (利用などは自己責任でどうぞ〜) //駄文同盟.com (http://www.dabun-doumei.com/) //2005.10.21制作 ツッコみは↑までどうぞ //!外部からのアクセスがない環境での利用を想定しています //実際に使用する際は想定外のPOSTデータを弾くよう改造してください //またセキュリティ面を気にする方は画像の妥当性(javascriptの偽装ではないかetc)もチェックしたほうが無難です //対象イメージのURL読み込み(htmlspe〜はたぶん無意味) //その気があるならスペースや"../"などの危なげな文字列をきちんと処理のこと) //もしくは今回は画像専用スクリプトなので問答無用でimagecreate〜()を使えばほぼ安全 $imgURL = htmlspecialchars($_POST['url'],ENT_QUOTES); //一時保存先作業ディレクトリなどを設定 $outputJpgURL = "(JPGファイルの出力先:例 image/output.jpg)"; $outputPngURL = "(PNGファイルの出力先:例 image/output.png)"; $limitFilesize = "(制限するファイルサイズのバイト数:例 10240)"; //対象イメージの拡張子を調べる $imgPass = pathinfo("$imgURL"); $imgExtension = $imgPass['extension']; //対象イメージの読み込み $img = file_get_contents("$imgURL"); //↑で読み込んだ画像データをファイルサイズチェック/圧縮用に保存する //($outputJpgURLにあるファイルに上書き保存) $outputResourse = fopen("$outputJpgURL","w"); flock($outputResourse,LOCK_EX); fwrite($outputResourse,$img); //↑↑で読み込んだ画像データ(=string)からイメージリソースを作成 $im = imagecreatefromstring($img); //対象イメージの拡張子がgifならpngに変換 //その他のファイル(要は$imgExtension != 'jpg')でもpngとしていったん保存しておく if($imgExtension == ('gif' | 'GIF' | 'png' | 'PNG' | 'bmp' | 'BMP'){ //pngイメージとして保存&ファイルサイズを調べる imagepng($im,"$outputPngURL"); $imgFilesize = filesize("$outputPngURL"); //保存したpngファイルを読み込み[上書き] $img = file_get_contents("$outputPngURL"); //pngファイルからイメージリソースを作成[上書き] $im = imagecreatefromstring($img); }else{ //jpg保存イメージのファイルサイズを調べる $imgFilesize = filesize("$outputJpgURL"); } //以下、pngの場合でもファイルサイズチェックを通る //(指定サイズ以上ならpngも何もかも強制jpg圧縮) //jpg/png保存イメージのファイルサイズが指定サイズを越えているならjpg圧縮 if($imgFilesize > $limitFilesize){ //jpe圧縮保存を繰り返す while(true){ $i++; //圧縮率は95→85→75→65と徐々に低下(厳しく圧縮) $assyuku = 95 - 10*($i - 1); imagejpeg($im,"$outputJpgURL","$assyuku"); $outputFilesize = filesize("$outputJpgURL"); //指定サイズを下回るか4回圧縮を試みるかした場合はwhileを抜ける if($outputFilesize < $limitFilesize || $i > 4){break;} } //で、圧縮した生成ファイルを読み込む readfile("$outputJpgURL"); $outputExtension = "jpeg"; }elseif($imgExtension == 'gif'){ //png保存した対象イメージが指定サイズ以下ならpngのまま読み込む readfile("$outputPngURL"); $outputExtension = "png"; }else{ //対象イメージが最初から指定サイズ以下なら圧縮せず読み込む readfile("$outputJpgURL"); $outputExtension = "jpeg"; } //header指定(ここでよいのかはギモン/きちんと動くのでとりあえず不問) header("Content-Type:image/${outputExtension}"); ?>

利用するには上記のテキストをphpで保存(設定する必要がある3項目は書き換える必要アリ)したのち、 そのphpファイルにmethod=postでURLを直接送り込むだけ(当然getならもっとラクチン)。いろいろと不安があるようならばその際正規表現でモニョモニョしておくと腹痛の種は減ります。 が、プロクシ利用される危険性(URLを入れられまくって外部利用されたり)もありますし、くれぐれも閉鎖された環境か信頼できる環境でのご利用を!

[追記]postやgetではなく、配列としてファイル名を大量にブチ込んだテキストを直に読ませればあっという間にバッチ処理システムontheNet(カッコよく言ってみた)の完成ですね。 GDライブラリの画像処理力は結構高性能なので、Photoshopなどの圧縮/減色ソフトを持っていないという方にも使いでのあるスクリプトかもしれません。ただ大量に生成するとなると問題はサーバーへの負荷ですか(このスクリプトはいったんファイルを保存しなければならないあたりにも負荷をかけ気味)! あと掲示板などで利用する場合はページ呼び出しの際にいちいち画像を作るなんていうことはやってられませんからファイルの存在確認をやったほうが無難でしょうね。ファイルの生成時間を判定材料にするのも面白いかもしれません。

[追記] ウチのサイトの画像投稿掲示板では投稿時にワンクッションこのスクリプトをかませることで生成、掲示板のページ自体では生成後のファイルをそのまま参照するようにしています。これなら当然負荷の心配などは気にする必要がありません。プログラム自体に組み込まなくても(ちょっと設定を変える必要はありますが)気軽に応用して使えるのがこのテの簡易ネタの利点ですかね。

[私的メモ&余談] GDライブラリの仕様について。

  1. 元画像が透過gifや透過pngの場合、透過が反映されたまま作成⇒保存が可能(ただしGDライブラリ自体で透過〜は作れない……ハズ)
  2. pngのαチャンネルは作成の段階で無効になる模様(GDでは広義のレイヤーは未実装ということになるのでしょうか?)
  3. 透過させるとpng-24bitであっても256色に強制減色されるので、imageTTFTextなどと併用する場合は要注意(グラデーションがガッタガタに荒れる)
  4. アニメーションgifは1コマ目だけ反映
  5. ヘタに付加情報がないぶん、Photoshopで作ったファイルなどよりサイズが軽くなる傾向にある?
  6. ImageMagickよりキレイな出来上がり、のような気がする
戻る
          もっともアレゲなサーチエンジン。”
©駄文同盟.com -全創作系個人サイト検索エンジンver.2.1- 管理人:八満とシアン
URL:http://www.dabun-doumei.com/ | ver.1[元祖版]:since 2002.6.15 | ver.2:since 2004.11.24
This "MULTIMEDIA TRASH SEARCH" homepage(=website) is written in JAPANESE.
FONT Encoding:Japanese(Automatic detection or Shift_JIS) →about Shift_JIS(English)
AUTHOR & ADMINISTRATOR : hachiman_cian