2013年3月12日火曜日

スマフォWEBアプリで写真をタイル表示させる件。(2)

ということで、タイル状に配置する件ですが、タテ長の場合、ヨコ長の場合に、
おおまかに言えば、【必ず入るように配置】の場合と、【部分的に正方形で表示】の場合が考えられます。まぁやりかたとしては大してかわりませんが、
【必ず入るように配置】は、以下ですね。



そして、部分画像と割り切って、正方形としてしまうのが、以下です。
スマフォのアプリなんかはこっちです。


もちろん、部分画像にした方が、切れてしまう部分はあるものの、
解像度としては高くなり有利ではあります。
でも、それは、写真の一覧だからであって、何かしらの選択の場合に、やはり全体をみて欲しいときもあります。その場合は前者になりますね。

どっちにしてもPHPでの実装は非常に簡単で、まず前者の場合。
【画像をLOAD】→【タテとヨコを測る】→【タテヨコ大きい方の数値で正方形の画像を生成】
→【LOADした画像を中央に配置】→【作成した画像をそのまま出力】
で完成。
後者の場合も、
【画像をLOAD】→【タテとヨコを測る】→【タテヨコ小さい方の数値で正方形の画像を生成】
→【LOADした画像を中央に配置】→【作成した画像をそのまま出力】

ということで、正方形にする時の辺の長さをどこをとるかだけの差です。
もちろんその場合に、サムネイル用の場合を考えれば、
あえて、縮小した大きさの正方形で作成するというのも、用途によってはアリですね。

ということで、PHPを。
エラー処理とかしてませんので(-_-;)

 // $fn:ファイルパス
 $localimage = imagecreatefrompng($fn);  // PNGの時
// $localimage = imagecreatefromjpeg($fn); // JPEGの時
 //------------------
 $ww = imagesx ( $localimage );
 $hh = imagesy ( $localimage );
 //------------------
 if($ww > $hh){
  $hh2 = $ww;
  $ww2 = $ww;
 }else{
  $ww2 = $hh;
  $hh2 = $hh;
 }
 //------------------
 $image   = imagecreatetruecolor($ww2, $hh2);
 $bgColor  = imagecolorallocate($image, 0x0, 0x0, 0x0);
 imagefill($image, 0, 0, $bgColor);   // 背景を塗ってから
// imagecolortransparent($image,$bgColor);  // 透明にしたいとき
 $bb = imagecopy($image, $localimage, 
   (int)(($ww2 - $ww)/2), (int)(($hh2 - $hh)/2),   // COPY先
   0, 0,            // COPY元
   $ww, $hh);
 if(is_resource ( $localimage )) imagedestroy($localimage);
 header('Content-type: image/jpeg');
 imagejpeg($img);

0 件のコメント:

コメントを投稿