ホームページ  >  記事  >  バックエンド開発  >  PHP で画像を固定サイズにトリミングする_PHP チュートリアル

PHP で画像を固定サイズにトリミングする_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:37:18886ブラウズ

做一个首页调用图像,有时候往往需要获得固定大小的图像,因为首页的图像位置通常由设计人员指定好了,如果是做最新发布图像调用,因为不知道客户会上传什么比例的图像,所以,有时候也就没有办法确定图像的比例,前台页面编写人员通常会采用固定 img 元素高宽的办法来达到控制图像不溢出,但如果图像的比例不是需要的比例,就会造成图像调用后变形,很大程度上影响了页面的美观,有解决的方法是,按照原图比例进行缩放,缩放后的图像难免会有空白,空白处填以颜色,这样虽然图像不变形了,但这样会有很多问题,比如,如果用户发一个图像很高但宽度一般的图像,如果压缩成一个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两种,即一边放大,一边缩小的情况加上等于的判断
对于1,2,函数处理代码完全相同,所以可以归纳成一个处理语句

给出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 "params width または height error エラー!";
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) {
case IMAGETYPE_JPEG :
$src_img=imagecreatefromjpeg($src_file);
break;
case IMAGETYPE_PNG :
$src_img=imagecreatefrompng( $src_file);
break;
case IMAGETYPE_GIF :
$src_img=imagecreatefromgif($src_file);
break;
default:
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_h > 1)) {
if($ratio_w < $ratio_h) {
$ratio = $ratio_h ;高さ方向、高さの比率標準に従ってトリミングまたは拡大します
}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) {
case IMAGETYPE_JPEG :
imagejpeg($new_img, $dst_file) ,100); // 画像を保存
break;
case IMAGETYPE_PNG :
imagepng($new_img,$dst_file,100);
break;
case IMAGETYPE_GIF :
imagegif($new_img,$dst_file,100);
break;
default:
break;
}
} // end if 1
// 2 対象画像の片側が元の画像より大きく、片側が元の画像より小さい まず通常の画像を拡大してからトリミングします。それ
// =if( ($ratio_w < 1 && $ratio_h > 1) || ($ rate_w >1 && $ratio_h <1) )
else{
$ratio=$ratio_h>$ratio_w? rate_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) {
case IMAGETYPE_JPEG :
imagejpeg($new_img, $dst_file,100); // 保存画像
break;
case IMAGETYPE_PNG :
imagepng($new_img,$dst_file,100);
break;
case IMAGETYPE_GIF :
imagegif($ new_img,$dst_file,100);
break;
default:
break;
}
}// if3
}// 関数を終了します
?>

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/486567.html技術記事ホームページ呼び出し画像を作成する場合、通常、ホームページの画像位置はデザイナーによって指定されるため、固定サイズの画像を取得する必要がある場合があります。最新リリースの画像呼び出しを作成している場合は、...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。