[CakePHP] 画像の圧縮比を変えて出力する

CakePHP楽天APIで携帯サイトを作っているのだが、楽天APIで取得できる画像は、携帯用にそのまま表示すると、画像サイズがでかい。1ページあたりに3枚表示するくらいがやっとだ。

なので、CakePHPで画像ファイルの圧縮率を下げるアクションを追加してみた。

まずは、コントローラーに以下のように作ってみた。

app/controllers/convjpgs_controller.php

class ConvjpgsController extends AppController {
var $name = 'Convjpgs';
function down(){
$this->layout = false;
$this->autoRender = false;
header('Content-type: image/jpeg');
$img = imagecreatefromjpeg('http://'.implode('/',$this->params['pass']).'?_ex=128x128');
imagejpeg($img, NULL, 75);
imagedestroy($img);
}


解説すると、$this->layout=false:と$this->autoRender=false;でビューを出力しないようにしている。

次に、header('Content-type: image/jpeg');で画像ファイルを出力するためのMIMEヘッダーを出力。

imagecreatefromjpegでURLとして渡されたJPGのURLをそのままJPGファイルとして読みこみ、

imagejpeg($img, NULL, 75);

で、圧縮比75%で再出力している。

ちなみにビューからは以下のようにURLを指定する。

< ?php echo $html->image('/convjpgs/down/'.$product['smallImageUrl'],array('alt' => $product['itemName']),null,null,false); ?>

アクション、/convjpgs/down/に画像のURLを渡せば、再圧縮されて画像が出力されるというわけだ。