ホームページ >バックエンド開発 >PHPチュートリアル >PHP画像の自動トリミング
そのようなポータルサイトをやったことがある方なら、画像が異なるサイズや比率で表示される可能性があることを知っているはずです
画像を 1 つだけ使用すると、間違いなく変形して表示されます。小さな写真を大きな写真にリンクするのはもったいない... 場所ごとに比率やサイズが異なるため、サムネイルを使用するのは完璧ではありません!!!!!!
上の写真をご覧ください。
ここで実際に転送されるのはリストですが、写真のサイズが異なり、広いものもあれば狭いものもあります。このような状況に遭遇した場合はどうすればよいですか?元のアドレスは間違いなく変形します。この転送は自動的に行われます。画像に必要な幅と高ささえわかりません。 -------------------------------------- ------- ------------------------------------------- ------
本題に入りましょう:
私は常に PHP 自動トリミングという方法を使用してきました.../aaaa/abc_200_100.jpg または /aaaa /abc_200*100.jpg に似た画像アドレスと比較してください
私の方法は、画像が必要な上記のアドレスに似たアドレスに変換し、Apacheの書き換えを通じて画像を生成し、保存することです。
これにはいくつかの利点があります: まず、非常に柔軟で、画像がある場合は、変形せずに好きなだけ幅または高さを制御でき、プログラムは常に画像のコンテンツを表示します。二番目に、ルールの前に !d !f の判定があるため、一度イメージが生成されると、Apache は次回プログラムにリダイレクトされません。これは、現在のファイルが存在しないことを意味します。次回その写真が存在する場合、それは実際の写真になります
欠点は、より多くの写真が生成され、より多くのスペースを占める可能性があることですが、問題はありません。独自のサーバーがあれば、分類して並べ替えることができます
OK これがコードです。例として discuz を見てみましょう
function Crop_img($img, $width = 200, $height = 200) {
$img_info = parse_url($img);
/* 外部リンクは画像アドレスを直接返します */
if (!empty($img_info['host']) && $img_info['host'] != $_SERVER [' HTTP_HOST']) {
$img; $img; $width . substr($img, $pos); / * 外部リンクは画像アドレスを直接返します */
if (!empty($img_info['host']) && $img_info['host'] != $_SERVER[ 'HTTP_HOST']) {
「 $ . width . '_' . $height . substr($img, $pos);
echo '';
return ;
}
}
関数的用法 crop_img('原图地址','宽度','高さ');この関数数は処理されたものに対して返されますたとえば、discuz テンプレートでこの関数を呼び出すと、img 関数はイメージ タグ文字列を直接返します。{eval img($pic,200,100)}
返されるアドレスは /data/attachment/forum/aaaaaa_200_100.jpg です。存在する場合、このイメージは存在しません
2 番目のステップでは、Apache の書き換えルールを追加する必要があります
RewriteEngine on
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() ;
flash();
} else {
if(!preg_match('/_(d+)_(d+)/', $url, $wh)){
defulat();
exit( );
}
$width = $wh[1];
$height = $wh[2];
sum(realpath($src), $width, $height, $filename, 'crop', '85');
}
function subject($src, $width, $height, $filename, $mode = 'scale', $quality = '100') {
try {
$imageValue = getimagesize($src);
$sourceWidth = $imageValue[0]; //原图宽
$sourceHeight = $imageValue[1]; //原图高
$thumbWidth = $width; //缩略图宽
$thumbHeight = $height; //缩略图高
$_x = 0;
$_y = 0;
$w = $sourceWidth;
$h = $sourceHeight;
if ($mode == 'scale '){
if ($sourceWidth <= $thumbWidth && $sourceHeight <= $thumbHeight) {
$_x = Floor(($thumbWidth - $sourceWidth) / 2);
$_y = Floor(($thumbHeight - $sourceHeight) ) / 2);
$thumbWidth = $sourceWidth;
$thumbHeight = $sourceHeight;
} else {
if ($th umbHeight * $sourceWidth > $thumbWidth * $sourceHeight) {
$thumbHeight = 床($sourceHeight * $width / $sourceWidth);
$_y = Floor(($height - $thumbHeight) / 2);
} else {
$thumbWidth = Floor( $sourceWidth * $height / $sourceHeight) ;
$_x = Floor(($width - $thumbWidth) / 2);
}
}
} else if ($mode == 'cro p') {
if ($sourceHeight < $thumbHeight ) { //如果原图尺寸小より当前尺寸
$thumbWidth = Floor($thumbWidth * $sourceHeight / $thumbHeight);
$thumbHeight = $sourceHeight;
}
if ($sourceWidth <; $thumbWidth) {
$thumbHeight = Floor($thumbHeight * $sourceWidth / $thumbWidth);
$thumbWidth = $sourceWidth;
}
$ S1 = $ SourceWidth /$ Sourceheight; // 元の比率 $ s2 = $ width /$ height; // 新しい図の比率 ($ s1 == $ s2) {}} else if ($s1 > $s2) { //全高 $x = ($ax - $thumbWidth ) / 2; $x = 0; $ay = Floor($sourceHeight * ($thumbWidth / $sourceWidth)) / /元の画像をシミュレートする比例高さヘッダー( "Content-Type:Image/JPeg"); $y, $width, $height, $w, $h); // if ($_SERVER['HTTP_REFERER'] || false !==tripos($_SERVER['HTTP_REFERER'], 'http:// ' . $_SERVER['SERVER_NAME'])) { $thum b、$filename、$quality); $filename } } function defulat() { $default_img = realpath( 'media/images/nopic.jpg'); ob_start(); type header('Content-:image/jpeg') ; readfile($default_img); ob_flush(); flash( );}
親指機能はトリミング方法を制御できます。スケールは比例スケーリング、トリミングなし、不十分な領域は白で塗りつぶされます、トリミングはトリミングです、必要なアスペクト比が元の画像のアスペクト比より大きい場合、最大表示幅が維持されます, 縦横比を元の画像の縦横比より小さくする必要がある場合は、最大の高さを維持して左右の余分な部分をトリミングします。変形せずに画像を縮小し、画像の内容を最大限に維持します。笑、このコードはどれだけ素晴らしいですか? 試してみれば、もちろん、書き換え機能と GD2 のサポートが必要であることがわかります。