画像ファイルを指定容量ぎりぎりに圧縮する
画像ファイルを指定容量以下ぎりぎりに圧縮して出力する方法です。
JPEG、PNGでは、画像の圧縮比が可変のため容量に合わせて圧縮比を変えることができます。
GIFでは仕様上、容量を少なくするには使用する色数を減らしたり画像を単純化したりするためこのコードでは対応できません。
<?php
/* ================================
* 画像を指定容量以下に圧縮する
*
* @create 2009/06/12
* @author pentan
* @url http://pentan.info/
*
* Copyright (c) 2009 pentan.info All Rights Reserved.
* 著作権表示部分の変更削除は禁止です
* ================================
*/
// 最大容量 (バイト単位)
$limit=100*1024;
// 読み込み画像のパス jpeg/pngに対応
$img_path="test.jpg";
// ファイルの存在チェック
if(empty($img_path) || !is_file($img_path)){
header("HTTP/1.x 404 Not Found");
exit;
}
list($img_width,$img_height,$type)=getimagesize($img_path);
// ファイルの種類判別
switch( $type ){
case 2:
$img_input_func ="imagecreatefromjpeg";
$img_output_func="imagejpeg";
$img_contenttype="image/jpeg";
$start=100;
$end=1;
$step=-5;
break;
case 3:
$img_input_func ="imagecreatefrompng";
$img_output_func="imagepng";
$img_contenttype="image/png";
$start=0;
$end=9;
$step=1;
break;
default:
header("HTTP/1.x 404 Not Found");
exit;
break;
}
// ファイル読み込み
if(!($src=@$img_input_func($img_path))){
header("HTTP/1.x 404 Not Found");
exit;
}
$quality=$start;
while(true){
ob_start();
$img_output_func($src,null,$quality);
$quality+=$step;
$outfile=ob_get_clean();
$file_size=strlen($outfile);
if($file_size <= $limit)break;
if($start <= $quality && $quality <= $end)continue;
if($end <= $quality && $quality <= $start)continue;
break;
}
imagedestroy($src);
// 圧縮限界チェック
if($file_size > $limit){
header("HTTP/1.x 404 Not Found");
exit;
}
header("Content-Type: " . $img_contenttype);
echo $outfile;
関連記事
- PHPでwebサーバー(apache/nginx)の実行ユーザー・グループを確認する方法
- リクエストヘッダーやリクエストボディーなどを取得する方法
- 負荷が高いときには503エラーを返す方法
- サイトの更新情報をPINGサーバに送信する方法
- PHPでロードアベレージを表示させる方法
- PHPでTwitterのツイートをする/ツイート一覧を取得する/検索する(API v1.1)
- インクルードパスを設定する方法
- オブジェクト(Object)を配列(Array)に変換する方法
- PHPでgzip圧縮形式(gz圧縮)のファイルを読み書きする方法
- PHPでfacebook投稿時に公開範囲を指定する方法
- PHPで複数の画像をfacebookに投稿する方法
- PHPでfacebookのフィード(ウォール)に投稿する方法
- PHPでのfacebookアプリの認証処理(APIを使うユーザー認証)
- MySQL関数のまとめ
- MySQLサーバに接続できるかどうかを確認する
- ディレクトリ内のファイルのパーミッションを一括で変更する
- POSTでアップロードできるファイルサイズの制限を変更する方法
- 暗号化・複合化を行う ブロック暗号
- date型やdatetime型と年月日時分秒への変換
- 関数・メソッドの存在を調べる方法
- PHPでTwitterのbotを作る方法 ツイートをする/ツイート一覧を取得する(API v1)
- strtotimeの指定
- PHPでHTMLメールを送る方法
- ディレクトリセパレータを短く定義する DIRECTORY_SEPARATOR
- モザイク画像を作る方法
- HTML内のアクセス解析タグを除去する方法
- HTMLのTABLEタグを簡単にCSVファイルに変換する方法
- 画像表示のときに指定サイズにリサイズする(画像の拡大縮小)
- テキストを可逆的な暗号化する Crypt_Blowfish
- PHPでwhois検索をする Net_Whois
- よく使うヘッダー関数のまとめ
- キャリア・世代を判別する
- mb_send_mailでCCやBCCを指定する 表示名を指定する
- より高速に、推測困難な一意なIDを生成する方法
- 指定したHTTPヘッダーが送信済みあるいは送信予定に含まれているか
- DOCUMENT ROOTを得る $_SERVER["DOCUMENT_ROOT"]は使えない!
- マルチバイト文字列(日本語文字)を一文字づつ取り出す
- ファイルを削除する/フォルダを削除する
- ファイルを読み込む/ファイルに書き込む
- ディレクトリ内のファイル一覧を取得する
- quoted-printable文字列の変換
スポンサーリンク





