PHP图片自动裁切应付不同尺寸的显示
《PHP图片自动裁切应付不同尺寸的显示》要点: PHP编程如果做过那种门户站的朋友,肯定知道,一张图片可能会在不同的地方显示,大小不同,比例也不同, PHP编程请看上图. PHP编程我一直用一种办法,就是PHP 自动裁切...相比你们看到过类似那种图片地址吧 /aaaa/abc_200_100.jpg 或者/aaaa/abc_200*100.jpg PHP编程第一,非常灵活,在有图片地方,你需要多宽多高,都可以随意 控制,不会变形,而且程序永远会让图片内容显示的最多
代码如下:
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,$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,$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),$height,$filename,'crop','85'); } function thumb($src,$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,imagecolorallocate($thumb,255,255)); imagecopyresampled($thumb,$source,$x,$y,$w,$h); imagejpeg($thumb,null,$quality); // if ($_SERVER['HTTP_REFERER'] || false !== stripos($_SERVER['HTTP_REFERER'],'http://' . $_SERVER['SERVER_NAME'])) { imagejpeg($thumb,$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、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |