ホームページ > バックエンド開発 > PHPチュートリアル > PHP 画像は、さまざまなサイズの表示に対応するために自動的にトリミングされます_PHP チュートリアル

PHP 画像は、さまざまなサイズの表示に対応するために自動的にトリミングされます_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:16:48
オリジナル
1007 人が閲覧しました

PHP 画像は、さまざまなサイズの表示に対応するために自動的にトリミングできます

この種のポータル サイトを作成したことがある場合は、画像がさまざまなサイズと比率でさまざまな場所に表示される可能性があることを知っているはずです

1枚だけだとどうしてもデフォルメされてしまいますし、小さい画像が表示されているところに大きい画像をリンクさせるのはもったいない… サムネイルだとどこにでも出てくるので完璧ではありません 比率や大きさが違う可能性があります違うことをしてください。ここに例があります!


PHP图片自动裁切应付不同尺寸的显示 帮客之家

上の写真をご覧ください。

ここで、実際に転送されるのはリストですが、写真のサイズが異なり、広いものもあれば狭いものもあり、そのような状況に遭遇した場合はどうすればよいでしょうか。この調整は、画像に必要な幅と高さがわかりません。 -------------------------------------------------- -------------------------------------------------- ---------------
本題に入りましょう:

私は常に 1 つの方法を使用してきました。それは、PHP 自動トリミングです.../aaaa/abc_200_100.jpg または /aaaa/abc_200*100.jpg に似た画像アドレスと比較してください

私の方法は、画像アドレスを画像が必要な上記のアドレスに変換し、Apache の書き換えによって処理プログラムに指示します。幅と高さに基づいて画像を生成し、保存します。
これを行うことにはいくつかの利点があります:

まず、非常に柔軟で、画像がある場所であればどこでも、変形することなく好きなだけ幅や高さを制御でき、プログラムは常に最も多くの画像コンテンツを表示します。 次に、イメージが一度生成されると、ルールの前に !d !f の判定があるため、Apache は次回プログラムにリダイレクトされません。これは、現在のファイルが存在しなくなるまでリダイレクトされないことを意味します。次回その写真が存在する場合、それは再び表示されなくなり、実際の写真になります

欠点は、より多くの写真が生成され、より大きなスペースを占める可能性があることですが、自分のサーバーであれば問題なく、分類して整理することができます

OK、これがコードです。例として discuz を見てみましょう

コードは次のとおりです:

関数 Crop_img($img, $width = 200, $height = 200) { $img_info = parse_url($img);
/* 外部リンクは画像アドレスを直接返します */
if (!empty($img_info['host']) && $img_info['host'] != $_SERVER['HTTP_HOST']) {
$img を返します;
} その他 {
$pos = strrpos($img, '.');
$img = substr($img, $pos) . $width . substr($img, $pos); $img を返します;
}
}

関数 img($img,$width,$height){
$img_info = parse_url($img);
/* 外部リンクは画像アドレスを直接返します */
if (!empty($img_info['host']) && $img_info['host'] != $_SERVER['HTTP_HOST']) {
$img を返します;
} その他 {
$pos = strrpos($img, '.');
$img = substr($img, $pos) . $width . substr($img, $pos); echo '';
戻ります;
}
}


関数の使用法 Crop_img('元の画像アドレス', '幅', '高さ'); この関数は、処理された画像アドレスを返します。たとえば、この関数を discuz テンプレート {eval img で呼び出します。 ($pic,200,100)}
この方法で返されるアドレスは /data/attachment/forum/aaaaaa_200_100.jpg です。次に、2 番目のステップを見てください。
2 番目のステップは、Apache の書き換えルールを追加することです

コードは次のとおりです:


リライトエンジンオン

RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^data/attachment/(.*)$images.php?url=$1 [L]




上記は、data/attachment/ アドレスの先頭に存在しないファイルは image.php に転送されて処理され、URL がパラメータとして渡されることを意味します

3 番目の部分は image.php のコードです

コードは次のとおりです:


$url = $_GET['url'];
$src = './data/attachment/' 。 preg_replace('/_(d+)_(d+)/', '', $url);
$filename = './data/attachment/' 。 $url;

if (file_exists($filename)) {
ob_start();
header('Content-type:image/jpeg');
readfile($filename);
ob_flush();
フラッシュ();
} その他 {
if(!preg_match('/_(d+)_(d+)/', $url, $wh)){
デフラット();
exit();
}
$width = $wh[1];
$height = $wh[2];
summ(realpath($src), $width, $height, $filename, 'crop', '85');
}

関数thumb($src, $width, $height, $filename, $mode = 'scale', $quality = '100') {
試してみてください{
$imageValue = getimagesize($src);
$sourceWidth = $imageValue[0]; //原图宽
$sourceHeight = $imageValue[1]; //原图高
$thumbWidth = $width; //缩略图宽
$thumbHeight = $height; //缩略图高
$_x = 0;
$_y = 0;
$w = $sourceWidth;
$h = $sourceHeight;
if ($mode == 'スケール') {
if ($sourceWidth $_x = フロア(($thumbWidth - $sourceWidth) / 2);
$_y = フロア(($thumbHeight - $sourceHeight) / 2);
$thumbWidth = $sourceWidth;
$thumbHeight = $sourceHeight;
} その他 {
if ($thumbHeight * $sourceWidth > $thumbWidth * $sourceHeight) {
$thumbHeight = Floor($sourceHeight * $width / $sourceWidth);
$_y = フロア(($height - $thumbHeight) / 2);
} その他 {
$thumbWidth = Floor($sourceWidth * $height / $sourceHeight);
$_x = フロア(($width - $thumbWidth) / 2);
}
}
} else if ($mode == 'crop') {
if ($sourceHeight < $thumbHeight) { //如果原图寸小さい当前尺寸
$thumbWidth = Floor($thumbWidth * $sourceHeight / $thumbHeight);
$thumbHeight = $sourceHeight;
}
if ($sourceWidth $thumbHeight = Floor($thumbHeight * $sourceWidth / $thumbWidth);
$thumbWidth = $sourceWidth;
}

$s1 = $sourceWidth / $sourceHeight; //原画比率
$s2 = $幅 / $高さ; //新しい画像の比率
if ($s1 == $s2) {

} else if ($s1 > $s2) { //全高
$y = 0;
$ax = フロア($sourceWidth * ($thumbHeight / $sourceHeight));
$x = ($ax - $thumbWidth) / 2;
$w = $thumbWidth / ($thumbHeight / $sourceHeight);

} else { //全宽度
$x = 0;
$ay = Floor($sourceHeight * ($thumbWidth / $sourceWidth)); //模拟原图比身長
$y = ($ay - $thumbHeight) / 2;
$h = $thumbHeight / ($thumbWidth / $sourceWidth);
}

}
スイッチ ($imageValue[2]) {
ケース 2: $source = imagecreatefromjpeg($src);
休憩;
ケース 1: $source = imagecreatefromgif($src);
休憩;
ケース 3: $source = imagecreatefrompng($src);
休憩;
ケース 6: $source = imagecreatefromwbmp($src);
休憩;
デフォルト: defulat();
戻ります;
}
header("コンテンツタイプ: image/jpeg");
$thumb = imagecreatetruecolor($width, $height);
imagefill($thumb, 0, 0, imagecolorallocate($thumb, 255, 255, 255));
imagecopyresampled($thumb, $source, 0, 0, $x, $y, $width, $height, $w, $h);
imagejpeg($thumb, null, $quality);
// if ($_SERVER['HTTP_REFERER'] || false !==tripos($_SERVER['HTTP_REFERER'], 'http://' . $_SERVER['SERVER_NAME'])) {
imagejpeg($thumb, $filename, $quality);
// }
imagedestroy($thumb);
imagedestroy($source);
} catch (例外 $ex) {
デフラット();
}
}

関数 defulat() {
$default_img = realpath('media/images/nopic.jpg');
ob_start();
header('Content-type:image/jpeg');
readfile($default_img);
ob_flush();
フラッシュ();
}


親指関数は、裁切方式を制御でき、スケールは等比放散、不裁切、不够の場所で白色充填、クロップは裁切、必要な場合は原図宽高比より大きい、那么は最大表示度を維持します、居中裁断上下多部分、要求宽高比が原図高比より小さい場合、那么は最大高を保持し、居中裁断左右多部分、总言之、変形を保持しない前提で、画像を小さくし、そして最大の画像を保持するこのコンテンツには、リライト機能と GD2 のサポートが必要です

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/896772.html技術記事 PHP の画像は、さまざまなサイズの表示に対応するために自動的に切り取られます。そのようなポータル サイトを作成したことがある場合は、画像がさまざまなサイズや比率で表示される可能性があることを知っているはずです。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート