[+]

すなおの戯言とかが書かれてる場所だと思う。フリスクバリムシャァ


画像のサムネイル表示

このブログもちょいちょいと弄ったりしてるのですが、僕の技術が乏しい所為もあってか
画像のサムネイル表示で苦戦したりしています…というのも IEだとmax-width、max-heightを
解釈してくれなくて、JavaScriptを使ってあーだこーだやってみるものの思い通りにいかず…

結局懲りてしまい、GDを使ってサムネイル画像を生成する方法に。

以下ソース。すごく適当でやっつけなのできちゃないです。

<?php

//Content-typeを変更
header ('Content-type: image/png');

//パラメータ
//i=ファイル名、s=1で小サイズ、q=1で常に低画質、2で常に高画質
$file = ''. @$_GET['i'];
$size = 0 + @$_GET['s'];
$rsmp = 0 + @$_GET['q'];

//色々な対策
$file = str_replace ("¥r",'',$file);
$file = str_replace ("¥n",'',$file);
$file = str_replace ('..','',$file);
$file = str_replace ('/' ,'',$file);
$file = str_replace ("¥¥",'',$file);
$file = str_replace (' ' ,'',$file);
$file = str_replace ("¥t",'',$file);

//拡張子判別
$mode = -1;
if (strrpos($file,'.') !== false) {
$type = substr($file,strrpos($file,'.') + 1);

if ($type == 'jpg' ) $mode = 0;
if ($type == 'jpeg') $mode = 0;
if ($type == 'JPG' ) $mode = 0;
if ($type == 'JPEG') $mode = 0;
if ($type == 'png' ) $mode = 1;
if ($type == 'PNG' ) $mode = 1;
if ($type == 'gif' ) $mode = 2;
if ($type == 'GIF' ) $mode = 2;
}

//色々な対策(その2)
if ($mode == -1 ) end;
if (file_exists($file) === false) end;
if ($file == '' ) end;

//画像ファイル読み込み
if ($mode == 0) $img = ImageCreateFromJPEG ($file);
if ($mode == 1) $img = ImageCreateFromPNG ($file);
if ($mode == 2) $img = ImageCreateFromGIF ($file);

//縮小サイズの設定
$thum_x = 512;
$thum_y = 640;
if ($size == 1) {
$thum_x = 240;
$thum_y = 256;
}

//縮小時の画質設定
if ($rsmp == 0) {
$rsmp = 1;
if ($mode != 0) $rsmp = 2;
if ($size == 1) $rsmp = 1;
}

//画像サイズの取得
$x = ImageSX ($img);
$y = ImageSY ($img);

//縮小比の計算
$r = 1.0;

if ($x >= $y) {
if ( $x > $thum_x) $r = $x / $thum_x;
if (($y / $r) > $thum_y) $r = $y / $thum_y;
}
if ($x < $y) {
if ( $y > $thum_y) $r = $y / $thum_y;
if (($x / $r) > $thum_x) $r = $x / $thum_x;
}

//サムネイル画像のサイズ計算
$xx = (int)($x / $r);
$yy = (int)($y / $r);

//サムネイル画像生成
$timg = ImageCreateTrueColor ($xx,$yy);
if ($rsmp == 1) ImageCopyResized ($timg,$img,0,0,0,0,$xx,$yy,$x,$y);
if ($rsmp == 2) ImageCopyResampled ($timg,$img,0,0,0,0,$xx,$yy,$x,$y);

//表示
ImagePNG ($timg);

//イメージの破棄
imagedestroy ($img );
imagedestroy ($timg);

?>


画像ファイルと同じディレクトリに入れて、URLのパラメータでファイル名等を指定してあげると
動きます。特に難しいスクリプトでもなんでもないですね…w

これで、アスペクト比を変えずに指定したサイズ内に収まってくれます。


でもまぁやっぱり、GDで処理するとめっちゃ重いですね…

JPEG形式の時と小さいサイズで表示する時はImageCopyResizedを使うようにしていますが、
PNG形式だとスクリーンショット等が多いと思うので、リサンプルするようにしてます。


本当はきちんとした画像アップローダを作って、アップロード時にサムネイル画像も生成、保存して…
って方法が一番いいんだと思うんですが…何にしろめんどくさくてw


IEを斬るって手段もあるんですけど、IEユーザーの多さを考えるとなかなかそうは行きません。


(◞‸◟)


2012/12/05(水)04:52:10  その他  コメント(0) 


この記事へのコメント


名前

コメント




| 前の記事 | 次の記事 | ホーム |



RSS

すなお  すなお

東風谷早苗信者の変態。
最近は何か作ってたりしてます。
完成は非常に遅い。





Copyright © 超絶はらへ('A`) All Rights Reserved.