PHPで画像をさまざまなサイズで表示する方法
一张图片可能会在不同的地方显示,大小不同,比例也不同,因此本例介绍的这个图片自动裁切还是比较有用的,有需求的朋友可以看看
如果做过那种门户站的朋友,肯定知道,一张图片可能会在不同的地方显示、大小不同、比例也不同,如果只用一张图的话,那么肯定会变形,而且在显示小图的地方,链接大图,又太浪费了.....用缩略图来处理,也不完美,因为每个地方出现的比例大小可能都不一样 。 (推荐学习:PHP视频教程)
PHP自动裁切相比你们看到过类似那种图片地址/aaaa/abc_200_100.jpg 或者/aaaa/abc_200*100.jpg
我的方式就是在需要图片地方把这个图片地址转化为类似上面的那种地址, 然后通过apache 的rewrite 定向到一个处理程序。根据宽高生成一个图片然后保存起来,在不动原图的任何信息和位置的情况下对图片做处理。
不好的地方,就是生成的图片可能会比较多,占用的空间也比较大,但是如果是自己服务器 那就无所谓了,可以归类整理下
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']) { return $img; } else { $pos = strrpos($img, '.'); $img = substr($img, 0, $pos) . '_' . $width . '_' . $height . substr($img, $pos); return $img; } } function img($img,$width,$height){ $img_info = parse_url($img); /* 外部链接直接返回图片地址 */ if (!empty($img_info['host']) && $img_info['host'] != $_SERVER['HTTP_HOST']) { return $img; } else { $pos = strrpos($img, '.'); $img = substr($img, 0, $pos) . '_' . $width . '_' . $height . substr($img, $pos); echo '<img src="'.$img.'" width="'.$width.'" height="'.$height.'" />'; return ; } }
函数的用法 crop_img('原图地址','宽度','高度'); 这个函数返回处理过的图片地址,img 函数直接返回图片标签字符串,比如在discuz模板里面调用这个函数 {eval img($pic,200,100)}
这样返回的地址就是/data/attachment/forum/aaaaaa_200_100.jpg 目前来说 这个图片是不存在 那么看第二步
第二步 需要添加apache的rewrite规则
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^data/attachment/(.*)$ images.php?url=$1 [L] </IfModule>
上面的意思,就是 data/attachement/这个地址开头不存在的文件都定向到image.php来处理,并且把url当参数传过去
第三步 就是image.php 这个里面的代码里
<?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(); flush(); } else { if(!preg_match('/_(\d+)_(\d+)/', $url, $wh)){ defulat(); exit(); } $width = $wh[1]; $height = $wh[2]; thumb(realpath($src), $width, $height, $filename, 'crop', '85'); } function thumb($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 ($thumbHeight * $sourceWidth > $thumbWidth * $sourceHeight) { $thumbHeight = floor($sourceHeight * $width / $sourceWidth); $_y = floor(($height - $thumbHeight) / 2); } else { $thumbWidth = floor($sourceWidth * $height / $sourceHeight); $_x = floor(($width - $thumbWidth) / 2); } } } else if ($mode == 'crop') { 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; //新图比例 if ($s1 == $s2) { } else if ($s1 > $s2) { //全高度 $y = 0; $ax = floor($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); } } switch ($imageValue[2]) { case 2: $source = imagecreatefromjpeg($src); break; case 1: $source = imagecreatefromgif($src); break; case 3: $source = imagecreatefrompng($src); break; case 6: $source = imagecreatefromwbmp($src); break; default: defulat(); return; } header("Content-type: 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 !== stripos($_SERVER['HTTP_REFERER'], 'http://' . $_SERVER['SERVER_NAME'])) { imagejpeg($thumb, $filename, $quality); // } imagedestroy($thumb); imagedestroy($source); } catch (Exception $ex) { defulat(); } } function defulat() { $default_img = realpath('media/images/nopic.jpg'); ob_start(); header('Content-type:image/jpeg'); readfile($default_img); ob_flush(); flush(); }
thumb 函数 可以控制 裁切方式,scale 为等比缩放,不裁切,不够的地方 用白色填充,crop 为裁切,如果要求的宽高比 大于原图宽高比,那么就保持最大显示宽度,居中裁切上下多余部分,如果要求宽高比小于原图宽高比,那么就保持最大高度,居中裁切左右多余部分,总而言之,在保持不变形的前提下 ,把图片缩小,而且最大保留图片的内容.哈哈 这个代码有多叼,试试知道了,,,当然你需要支持rewrite功能和GD2 支持
以上がPHPで画像をさまざまなサイズで表示する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます
