画像を変形させずに任意のサイズの画像に切り出す機能です。処理対象の画像のファイル名を入力し、新しい画像の保存ファイル名を生成し、画像を生成します。新しい画像の幅、画像の高さ...
bcastr を使用したことがある方は、bcastr によって、固定サイズの出力画像フレームの場合、ソース画像が次のような状況になることが保証されることを知っているはずです。
1: 出力される画像の高さと幅が元の画像の高さと幅より小さい場合、判定として記述されます $new_width 2: 出力する画像の高さと幅が元の画像の高さと幅よりも大きい場合、判定として記述 $new_width>$src_width && $new_height>$src_width3: 1 番目と 2 番目のタイプ、つまりズームアウト中にズームインする場合を除外し、さらに等しいと判断する
1と2は関数の処理コードが全く同じなので1つの処理文にまとめることができます
PHP 実装コードを指定します
/*
*説明: 画像を変形せずに任意のサイズの画像にトリミングする機能です
※パラメータ説明:処理対象の画像のファイル名、生成される新規画像の保存ファイル名、生成される新規画像の幅、生成される新規画像の高さを入力
* 執筆者: smallchicken
* 時刻 2008-12-18
*/
// 任意のサイズの画像を取得し、欠けている部分を引き伸ばします。変形や空白はありません
function my_image_resize($src_file, $dst_file , $new_width , $new_height) {
if($new_width <1 $new_height <1) {
echo "パラメータの幅または高さのエラー!";
exit();
}
if(!file_exists($src_file)) {
echo $src_file . " は存在しません !";
exit();
}
//画像タイプ
$type=exif_imagetype($src_file);
$support_type=array(IMAGETYPE_JPEG , IMAGETYPE_PNG , IMAGETYPE_GIF);
if(!in_array($type, $support_type,true)) {
echo "このタイプの画像はサポートされていません! jpg、gif、または png のみをサポートします";
exit();
}
//画像をロード
switch($type) {
ケース IMAGETYPE_JPEG :
$src_img=imagecreatefromjpeg($src_file);
休憩;
ケース IMAGETYPE_PNG :
$src_img=imagecreatefrompng($src_file);
休憩;
ケース IMAGETYPE_GIF :
$src_img=imagecreatefromgif($src_file);
休憩;
デフォルト:
echo "画像の読み込みエラー!";
exit();
}
$w=imagesx($src_img);
$h=imagesy($src_img);
$ratio_w=1.0 * $new_width / $w;
$ratio_h=1.0 * $new_height / $h;
$ratio=1.0;
// 生成される画像の高さ、幅は元の画像より小さい、または大きい場合は、拡大率を大きく、縮小率を大きくするのが原則です(縮小率は小さくなります)
if( ($ratio_w < 1 && $ratio_h < 1) ($ratio_w > 1 && $ratio_h > 1)) {
if($ratio_w < $ratio_h) {
$ratio = $ratio_h ; // ケース 1、幅の比率が高さ方向より小さい場合、高さの比率の基準に従ってトリミングまたは拡大します
}else {
$ratio = $ratio_w ;
}
// アスペクト比がターゲット要件を正確に満たす中間一時画像を定義します
$inter_w=(int)($new_width / $ratio);
$inter_h=(int) ($new_height / $ratio);
$inter_img=imagecreatetruecolor($inter_w , $inter_h);
imagecopy($inter_img, $src_img, 0,0,0,0,$inter_w,$inter_h);
// 最大辺の長さをターゲット画像として一時画像を生成 $ratio 比率
//新しい画像を定義します
$new_img=imagecreatetruecolor($new_width,$new_height);
imagecopyresampled($new_img,$inter_img,0,0,0,0,$new_width,$new_height,$inter_w,$inter_h);
switch($type) {
ケース IMAGETYPE_JPEG :
imagejpeg($new_img, $dst_file,100) // 画像を保存します
休憩;
ケース IMAGETYPE_PNG :
imagepng($new_img,$dst_file,100);
休憩;
ケース IMAGETYPE_GIF :
imagegif($new_img,$dst_file,100);
休憩;
デフォルト:
休憩;
}
} // 1
の場合は終了
// 2 対象画像の片側が元の画像より大きく、片側が元の画像より小さい まず通常の画像を拡大してからトリミングします
// =if( ($ratio_w <1 && $ratio_h > 1) ($ratio_w >1 && $ratio_h <1) )
それ以外{
$ratio=$ratio_h>$ratio_w? $ratio_h : $ratio_w // 大きい方の値を取得します
// 中央に大きな画像を定義し、画像の高さまたは幅はターゲット画像と同じにして、元の画像を拡大します
$inter_w=(int)($w * $ratio);
$inter_h=(int) ($h * $ratio);
$inter_img=imagecreatetruecolor($inter_w , $inter_h);
//拡大縮小後に元の画像をトリミング
imagecopyresampled($inter_img,$src_img,0,0,0,0,$inter_w,$inter_h,$w,$h);
//新しい画像を定義します
$new_img=imagecreatetruecolor($new_width,$new_height);
imagecopy($new_img, $inter_img, 0,0,0,0,$new_width,$new_height);
switch($type) {
ケース IMAGETYPE_JPEG :
imagejpeg($new_img, $dst_file,100) // 画像を保存します
休憩;
ケース IMAGETYPE_PNG :
imagepng($new_img,$dst_file,100);
休憩;
ケース IMAGETYPE_GIF :
imagegif($new_img,$dst_file,100);
休憩;
デフォルト:
休憩;
}
}// if3
}//関数を終了
?>