如果你对该文章中的内容有疑问/不解,可以点击此处链接提问
要注明问题和此文章链接地址 点击此处跳转
调用的时候:
$image = Helper_Image::createFromFile(‘文件路径’,‘文件保存格式’);
$image->resampled(‘’, ‘’); //缩放到100px * 100PX
$image->saveAsJpeg(‘文件路径’ ,’品质(1到100)’);
下面代码中部分代码被转义,使用时自己替换
resize($width, $height); * $image->saveAsJpeg('2.jpg'); * @endcode * * 对于上传的文件,由于其临时文件名中并没有包含扩展名。 * 因此需要采用下面的方法创建 Image 对象: * * @code php * $ext = pathinfo($_FILES['postfile']['name'], PATHINFO_EXTENSION); * $image = Image::createFromFile($_FILES['postfile']['tmp_name'], $ext); * @endcode * * @param string $filename 图像文件的完整路径 * @param string $fileext 指定扩展名 * * @return Helper_ImageGD 从文件创建的 Helper_ImageGD 对象 * @throw Q_NotImplementedException */ static function createFromFile($filename, $fileext) { echo $fileext = trim(strtolower($fileext), '.'); $ext2functions = array( 'jpg' => 'imagecreatefromjpeg', 'jpeg' => 'imagecreatefromjpeg', 'png' => 'imagecreatefrompng', 'gif' => 'imagecreatefromgif' ); if (!isset($ext2functions[$fileext])) { throw new Q_NotImplementedException(__('imagecreateform' . $fileext)); } $handle = call_user_func($ext2functions[$fileext], $filename); return new Helper_ImageGD($handle); } /** * 将 16 进制颜色值转换为 rgb 值 * * 用法: * @code php * $color = '#369'; * list($r, $g, $b) = Helper_Image::hex2rgb($color); * echo "red: {$r}, green: {$g}, blue: {$b}"; * @endcode * * @param string $color 颜色值 * @param string $default 使用无效颜色值时返回的默认颜色 * * @return array 由 RGB 三色组成的数组 */ static function hex2rgb($color, $default = 'ffffff') { $hex = trim($color, '#&Hh'); $len = strlen($hex); if ($len == 3) { $hex = "{$hex[0]}{$hex[0]}{$hex[1]}{$hex[1]}{$hex[2]}{$hex[2]}"; } elseif ($len < 6) { $hex = $default; } $dec = hexdec($hex); return array(($dec >> 16) & 0xff, ($dec >> 8) & 0xff, $dec & 0xff); } } /** * Helper_ImageGD 类封装了一个 gd 句柄,用于对图像进行操作 * * @author YuLei Liao * @version $Id: image.php 1937 2009-01-05 19:09:40Z dualface $ * @package helper */ class Helper_ImageGD { /** * GD 资源句柄 * * @var resource */ protected $_handle = null; /** * 构造函数 * * @param resource $handle GD 资源句柄 */ function __construct($handle) { $this->_handle = $handle; } /** * 析构函数 */ function __destruct() { $this->destroy(); } /** * 快速缩放图像到指定大小(质量较差) * * @param int $width 新的宽度 * @param int $height 新的高度 * * @return Helper_ImageGD 返回 Helper_ImageGD 对象本身,实现连贯接口 */ function resize($width, $height) { if (is_null($this->_handle)) return $this; $dest = imagecreatetruecolor($width, $height); imagecopyresized($dest, $this->_handle, 0, 0, 0, 0, $width, $height, imagesx($this->_handle), imagesy($this->_handle)); imagedestroy($this->_handle); $this->_handle = $dest; return $this; } /** * 缩放图像到指定大小(质量较好,速度比 resize() 慢) * * @param int $width 新的宽度 * @param int $height 新的高度 * * @return Helper_ImageGD 返回 Helper_ImageGD 对象本身,实现连贯接口 */ function resampled($width, $height) { if (is_null($this->_handle)) return $this; $dest = imagecreatetruecolor($width, $height); imagecopyresampled($dest, $this->_handle, 0, 0, 0, 0, $width, $height, imagesx($this->_handle), imagesy($this->_handle)); imagedestroy($this->_handle); $this->_handle = $dest; return $this; } /** * 调整图像大小,但不进行缩放操作 * * 用法: * @code php * $image->resizeCanvas($width, $height, 'top-left'); * @endcode * * $pos 参数指定了调整图像大小时,图像内容按照什么位置对齐。 * $pos 参数的可用值有: * * - left: 左对齐 * - right: 右对齐 * - center: 中心对齐 * - top: 顶部对齐 * - bottom: 底部对齐 * - top-left, left-top: 左上角对齐 * - top-right, right-top: 右上角对齐 * - bottom-left, left-bottom: 左下角对齐 * - bottom-right, right-bottom: 右下角对齐 * * 如果指定了无效的 $pos 参数,则等同于指定 center。 * * @param int $width 新的高度 * @param int $height 新的宽度 * @param string $pos 调整时图像位置的变化 * @param string $bgcolor 空白部分的默认颜色 * * @return Helper_ImageGD 返回 Helper_ImageGD 对象本身,实现连贯接口 */ function resizeCanvas($width, $height, $pos = 'center', $bgcolor = '0xffffff') { if (is_null($this->_handle)) return $this; $dest = imagecreatetruecolor($width, $height); $sx = imagesx($this->_handle); $sy = imagesy($this->_handle); // 根据 pos 属性来决定如何定位原始图片 switch (strtolower($pos)) { case 'left': $ox = 0; $oy = ($height - $sy) / 2; break; case 'right': $ox = $width - $sx; $oy = ($height - $sy) / 2; break; case 'top': $ox = ($width - $sx) / 2; $oy = 0; break; case 'bottom': $ox = ($width - $sx) / 2; $oy = $height - $sy; break; case 'top-left': case 'left-top': $ox = $oy = 0; break; case 'top-right': case 'right-top': $ox = $width - $sx; $oy = 0; break; case 'bottom-left': case 'left-bottom': $ox = 0; $oy = $height - $sy; break; case 'bottom-right': case 'right-bottom': $ox = $width - $sx; $oy = $height - $sy; break; default: $ox = ($width - $sx) / 2; $oy = ($height - $sy) / 2; } list ($r, $g, $b) = Helper_Image::hex2rgb($bgcolor, '0xffffff'); $bgcolor = imagecolorallocate($dest, $r, $g, $b); imagefilledrectangle($dest, 0, 0, $width, $height, $bgcolor); imagecolordeallocate($dest, $bgcolor); imagecopy($dest, $this->_handle, $ox, $oy, 0, 0, $sx, $sy); imagedestroy($this->_handle); $this->_handle = $dest; return $this; } /** * 在保持图像长宽比的情况下将图像裁减到指定大小 * * crop() 在缩放图像时,可以保持图像的长宽比,从而保证图像不会拉高或压扁。 * * crop() 默认情况下会按照 $width 和 $height 参数计算出最大缩放比例, * 保持裁减后的图像能够最大程度的充满图片。 * * 例如源图的大小是 800 x 600,而指定的 $width 和 $height 是 200 和 100。 * 那么源图会被首先缩小为 200 x 150 尺寸,然后裁减掉多余的 50 像素高度。 * * 用法: * @code php * $image->crop($width, $height); * @endcode * * 如果希望最终生成图片始终包含完整图像内容,那么应该指定 $options 参数。 * 该参数可用值有: * * - fullimage: 是否保持完整图像 * - pos: 缩放时的对齐方式 * - bgcolor: 缩放时多余部分的背景色 * - enlarge: 是否允许放大 * - reduce: 是否允许缩小 * * 其中 $options['pos'] 参数的可用值有: * * - left: 左对齐 * - right: 右对齐 * - center: 中心对齐 * - top: 顶部对齐 * - bottom: 底部对齐 * - top-left, left-top: 左上角对齐 * - top-right, right-top: 右上角对齐 * - bottom-left, left-bottom: 左下角对齐 * - bottom-right, right-bottom: 右下角对齐 * * 如果指定了无效的 $pos 参数,则等同于指定 center。 * * $options 中的每一个选项都可以单独指定,例如在允许裁减的情况下将图像放到新图片的右下角。 * * @code php * $image->crop($width, $height, array('pos' => 'right-bottom')); * @endcode * * @param int $width 新的宽度 * @param int $height 新的高度 * @param array $options 裁减选项 * * @return Helper_ImageGD 返回 Helper_ImageGD 对象本身,实现连贯接口 */ function crop($width, $height, $options = array()) { if (is_null($this->_handle)) return $this; $default_options = array( 'fullimage' => false, 'pos' => 'center', 'bgcolor' => '0xfff', 'enlarge' => false, 'reduce' => true, ); $options = array_merge($default_options, $options); // 创建目标图像 $dest = imagecreatetruecolor($width, $height); // 填充背景色 list ($r, $g, $b) = Helper_Image::hex2rgb($options['bgcolor'], '0xffffff'); $bgcolor = imagecolorallocate($dest, $r, $g, $b); imagefilledrectangle($dest, 0, 0, $width, $height, $bgcolor); imagecolordeallocate($dest, $bgcolor); // 根据源图计算长宽比 $full_w = imagesx($this->_handle); $full_h = imagesy($this->_handle); $ratio_w = doubleval($width) / doubleval($full_w); $ratio_h = doubleval($height) / doubleval($full_h); if ($options['fullimage']) { // 如果要保持完整图像,则选择最小的比率 $ratio = $ratio_w < $ratio_h ? $ratio_w : $ratio_h; } else { // 否则选择最大的比率 $ratio = $ratio_w > $ratio_h ? $ratio_w : $ratio_h; } if (!$options['enlarge'] && $ratio > 1) $ratio = 1; if (!$options['reduce'] && $ratio < 1) $ratio = 1; // 计算目标区域的宽高、位置 $dst_w = $full_w * $ratio; $dst_h = $full_h * $ratio; // 根据 pos 属性来决定如何定位 switch (strtolower($options['pos'])) { case 'left': $dst_x = 0; $dst_y = ($height - $dst_h) / 2; break; case 'right': $dst_x = $width - $dst_w; $dst_y = ($height - $dst_h) / 2; break; case 'top': $dst_x = ($width - $dst_w) / 2; $dst_y = 0; break; case 'bottom': $dst_x = ($width - $dst_w) / 2; $dst_y = $height - $dst_h; break; case 'top-left': case 'left-top': $dst_x = $dst_y = 0; break; case 'top-right': case 'right-top': $dst_x = $width - $dst_w; $dst_y = 0; break; case 'bottom-left': case 'left-bottom': $dst_x = 0; $dst_y = $height - $dst_h; break; case 'bottom-right': case 'right-bottom': $dst_x = $width - $dst_w; $dst_y = $height - $dst_h; break; case 'center': default: $dst_x = ($width - $dst_w) / 2; $dst_y = ($height - $dst_h) / 2; } imagecopyresampled($dest, $this->_handle, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $full_w, $full_h); imagedestroy($this->_handle); $this->_handle = $dest; return $this; } /** * 保存为 JPEG 文件 * * @param string $filename 保存文件名 * @param int $quality 品质参数,默认为 80 * * @return Helper_ImageGD 返回 Helper_ImageGD 对象本身,实现连贯接口 */ function saveAsJpeg($filename, $quality = 80) { imagejpeg($this->_handle, $filename, $quality); } /** * 保存为 PNG 文件 * * @param string $filename 保存文件名 * * @return Helper_ImageGD 返回 Helper_ImageGD 对象本身,实现连贯接口 */ function saveAsPng($filename) { imagepng($this->_handle, $filename); } /** * 保存为 GIF 文件 * * @param string $filename 保存文件名 * * @return Helper_ImageGD 返回 Helper_ImageGD 对象本身,实现连贯接口 */ function saveAsGif($filename) { imagegif($this->_handle, $filename); } /** * 销毁内存中的图像 * * @return Helper_ImageGD 返回 Helper_ImageGD 对象本身,实现连贯接口 */ function destroy() { if (!$this->_handle) { @imagedestroy($this->_handle); } $this->_handle = null; return $this; } }