CakePHP その12 〜ImageRenderコンポーネント〜 [CakePHP]
欲しいのが無ければ自分で作る!ってことで、自作コンポーネントを作ってみた。
まえから、楽天みたいに欲しい大きさで画像を返してくれる仕組みが欲しかったんだよね。
PHP初級者でコンポーネントとかまともに作ったこと無いので、見よう見まねです。
- SwfUploadコンポーネントと一緒に使うことを想定してますが依存はしてません
- 1.2.0.5875で作りました
- GD2.0以上必須です。
- てか、Mac用XAMPP0.7.1上でしか動作確認してないです。
- GIFとJPGとPNGしかサポートしてません
- 実際の大きさ以上にはなりません
- 基本的に毎回サムネイルを生成してるので、当然ですが大量の画像を表示するとサーバーが死ぬと思います。
- これで良いのか、だれか教えてください
- 先頭の/* $Id$ */って何?
【修正】
- サイズの指定がなかったときのことを全く考えてなかったので、指定しない場合や0のときはそのまま出力するようにした(07.12.29)
で、使い方はSwfUploadコンポーネントのFILEコントローラーのopen関数を変更する
(自分は前回書いたようにFILEではなくIMAGEクラスとして使ってるので、IMAGEコントローラー)
変更前
function open($id) {
$file = $this->get($id);
if (isset($file)) {
$this->redirect($file['Image']['path'] . $file['Image']['name']);
exit();
}
}
変更後
function open($id=null,$maxsize=null){
$file = $this->get($id);
if (isset($file)) {
$filename = WWW_ROOT.$file['Image']['path'] . $file['Image']['name'];
if(is_file($filename)){
$this->ImageRender->max_size = $maxsize;
//$this->ImageRender->resampling = 'normal';
$this->ImageRender->render($filename);
}
}
}
で、SwfUploadコンポーネントでアップしたファイルには下記でアクセス。
http://localhost/image(クラス名)/open/(画像のid)/(欲しいサイズ)/
すると、欲しいサイズの大きさの画像が表示されます。
ええと、ヘルパーでの書き方はわかりません(なんせFlashで使うために作ったんで)
や、普通に書けば良いと思ういますがね…
ImageRenderコンポーネント
<?php
/* $Id$ */
/**
* ImageRenderComponent
* Copyright (C) 2007-2008
* @version 0.0.2
*/
/**
* @package ImageRenderComponent
* @subpackage controllers.components
*/
class ImageRenderComponent extends Object {
/* component configuration */
var $name = 'ImageRender';
/*
$params[0] width
$params[1] height
$params[2] type IMAGETYPE定数値
$params[3] attributes
$params['bits'] bits
$params['channels'] color channel
$params['mime'] mime type
*/
var $params = array();
var $img = null;
var $max_size = 0;
//$resampling リサンプリングの方式 normal or smooth
var $resampling = 'smooth';
function resize($filename=null){
//縦型か横型か
$maxsize = $this->max_size;
$w = $this->params[0];
$h = $this->params[1];
if($w == $h){
$cwidth = $maxsize;
$cheight = $maxsize;
}else if($w > $h){
$cpercent = $w/$maxsize;
$cwidth = $maxsize;
$cheight = ceil($h/$cpercent);
}else{
$cpercent = $h/$maxsize;
$cwidth = ceil($w/$cpercent);
$cheight = $maxsize;
}
switch($this->params[2]){
case 1:
$src = imagecreatefromgif($filename);
$img = imagecreate($cwidth,$cheight);
break;
case 2:
$src = imagecreatefromjpeg($filename);
$img = imagecreatetruecolor($cwidth,$cheight);
break;
case 3:
$src = imagecreatefrompng($filename);
$img = imagecreatetruecolor($cwidth,$cheight);
break;
default:
return false;
}
if($this->resampling == 'normal'){
$r = imagecopyresized($img,$src,0,0,0,0,$cwidth,$cheight,$w,$h);
}else{
$r = imagecopyresampled($img,$src,0,0,0,0,$cwidth,$cheight,$w,$h);
}
$this->img = $img;
return $r;
}
function load($filename=null){
$this->params = getimagesize($filename);
//
$r = 0;
if($this->max_size>0){
if(($this->params[0]>$this->max_size) || ($this->params[1]>$this->max_size)){
if($this->resize($filename,$this->max_size)){
$r = 1;
}
}
}
if(!$r){
$fo = fopen($filename, "rb");
$this->img = fread($fo,filesize($filename));
}
return $r;
}
function render($filename=null){
//情報の取得
$r = $this->load($filename);
$mime = $this->params['mime'];
header("Content-Type:".$mime);
if($r){
switch($this->params[2]){
case 1:
imagegif($this->img);
imagedestroy($this->img);
break;
case 2:
imagejpeg($this->img);
imagedestroy($this->img);
break;
case 3:
imagepng($this->img);
imagedestroy($this->img);
break;
default:
print $this->img;
break;
}
}else{
print $this->img;
}
exit();
}
}
?>
コメント 0