ホームページ呼び出し画像を作成する場合、ホームページの画像位置はデザイナーが指定することが多いため、最新リリース画像を呼び出す場合は何があるか分からないため、固定サイズの画像を取得する必要がある場合があります。そのため、画像の比率を決定する方法がない場合、フロントエンド ページの作成者は通常、画像のオーバーフローを制御するために img 要素の高さと幅を固定する方法を使用します。ただし、画像の比率が必要な比率でない場合、呼び出し後に画像が変形してしまい、ページの美しさに大きな影響を及ぼします。解決策の 1 つは、元の画像の比率に合わせて画像を拡大縮小することです。拡大縮小された画像には必然的に空白が生じます。この方法では、画像は変形しませんが、たとえば、ユーザーが非常に大きな画像を送信した場合、大きな歪みが発生します。高さはありますが幅は平均的であり、1:1 の画像に圧縮された場合、圧縮後に画像は基本的に表示されません。
ここでの私の解決策は、画像を固定サイズにトリミングすることです。画像は変形せず、空白部分は常に引き伸ばされて埋められます。bcastr を使用したことがある友人は、bcastr を知っているはずです。イメージ呼び出しが変形しないようにします。固定サイズの出力イメージ フレームの場合、ソース イメージは次のような状況になります。
1: 出力する画像の高さと幅がソース画像の高さと幅より小さい場合、判定として記述されます $new_width<$src_width && $new_height<$src_width
2: 出力する画像の高さと幅が元の画像の高さと幅よりも大きい場合、判定として記述されます $new_width>$src_width && $new_height>$src_width
3: 1 と 2 の 2 つのタイプ、つまりズームインとズームアウトが同時に行われる状況と等しいかどうかの判断を除く 1 と 2 は、関数の処理コードがまったく同じであるため、まとめることができます。 1 つの処理ステートメントに
まとめて、PHP 実装コード
<?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 "パラメータの幅または高さのエラー!";
出口();
}
if(!file_exists($src_file)) {
echo $src_file 。「存在しません!」;
出口();
}
//画像タイプ
$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 のみをサポートします";
出口();
}
//画像をロード
スイッチ($type) {
IMAGETYPE_JPEG の場合:
$src_img=imagecreatefromjpeg($src_file);
壊す;
ケース IMAGETYPE_PNG :
$src_img=imagecreatefrompng($src_file);
壊す;
ケース IMAGETYPE_GIF :
$src_img=imagecreatefromgif($src_file);
壊す;
デフォルト:
echo "画像の読み込みエラー!";
出口();
}
$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、幅の比率が高さ方向より小さい場合、高さの比率の基準に従ってトリミングまたは拡大します。
}それ以外 {
$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);
スイッチ($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);
スイッチ($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
}// 関数を終了します
?>