php 缩略图生成类,php生成图片缩略图类

/**

* @abstract 生成图片的缩略图,可以指定任意尺寸,生成的图片为png格式

* @example

* $file = 'test.png';

* $th =new Thumbnail();

* $th->GenerateThumbnail($file, 400, 500);

*

*/

class Thumbnail{

/**

* @var string $from 源图片

*/

private $from;

/**

* @var string $name 缩略图的文件名

*/

private $name = '';

/**

* @var 原图宽

*/

private $rWidth;

/**

* @var 原图高

*/

private $rHeight;

/**

* @var 缩略图宽

*/

private $tWidth;

/**

* @var 缩略图高

*/

private $tHeight;

/**

* @var 实际缩放到的宽度

*/

private $width;

/**

* @var 实际缩放到的高度

*/

private $height;

public function __construct(){

try{

if(!function_exists('gd_info')){

throw new Exception('Must GD extension is enabled');

}

}

catch(Exception $e){

$msg = 'class ' . __CLASS__ . ' Error:' . $e->getMessage();

echo $msg;

exit;

}

}

/**

* @var $from 原图像

* @var $width 生成的缩略图的宽

* @var $height 生成缩略图的高

* @var $name 生成的缩略图的文件名,不带后缀

* @return string 生成的缩略图

*/

public function GenerateThumbnail($from, $width, $height, $name=''){

try{

if(!file_exists($from)){

throw new Exception('File does not exist');

}

if($width <= 0){

throw new Exception('The width is invalid');

}

if($height <= 0){

throw new Exception('The height is invalid');

}

$this->from = $from;

$this->tWidth = $width;

$this->tHeight = $height;

if(!empty($name)){

$this->name = $name;

}

else{

$this->name = date('Ymd') . mt_rand(0, 9999);

}

$this->createThumbnail();

}

catch(Exception $e){

$msg = 'class ' . __CLASS__ . ' Error:' . $e->getMessage();

echo $msg;

exit;

}

}

public function getThumbnail(){

return $this->name;

}

/**

* 生成缩略图文件

*/

private function createThumbnail(){

try{

//读取原始图像信息

$sourceInfo = getimagesize($this->from);

$this->rWidth = $sourceInfo[0];

$this->rHeight = $sourceInfo[1];

//创建缩略图图像资源句柄

$new_pic = imagecreatetruecolor($this->tWidth, $this->tHeight);

//原图绘制到缩略图的x、y坐标

$x = 0;

$y = 0;

//创建原始图像资源句柄

$source_pic = '';

switch ($sourceInfo[2]){

case 1: $source_pic = imagecreatefromgif($this->from); //gif

break;

case 2: $source_pic = imagecreatefromjpeg($this->from); //jpg

break;

case 3: $source_pic = imagecreatefrompng($this->from); //png

break;

default: throw new Exception('Does not support this type of image');

}

//计算缩放后图像实际大小

//原图宽高均比缩略图大

if($this->rWidth > $this->tWidth && $this->rHeight > $this->tHeight){

$midw = ($this->rWidth - $this->tWidth) / $this->rWidth; //宽缩小的比例

$midh = ($this->rHeight - $this->tHeight) / $this->rHeight; //高缩小的比例

//那个缩小的比例大以那个为准

if($midw > $midh){

$this->width = $this->tWidth;

$this->height = $this->rHeight - floor($this->rHeight * $midw);

$y = ($this->tHeight - $this->height) / 2;

}

else{

$this->width = $this->rWidth - floor($this->rWidth * $midh);

$this->height = $this->tHeight;

$x = ($this->tWidth - $this->width) / 2;

}

}

//原图宽高均比缩略图小

elseif($this->rWidth < $this->tWidth && $this->rHeight < $this->tHeight){

$midw = ($this->tWidth - $this->rWidth) / $this->rWidth; //宽放大的比例

$midh = ($this->tHeight - $this->rHeight) / $this->rHeight; //高放大的比例

//那个放大的比例小以那个为准

if($midw < $midh){

$this->width = $this->tWidth;

$this->height = $this->rHeight + floor($this->rHeight * $midw);

$y = ($this->tHeight - $this->height) / 2;

}

else{

$this->width = $this->rWidth + floor($this->rWidth * $midh);

$this->height = $this->tHeight;

$x = ($this->tWidth - $this->width) / 2;

}

}

//原图宽小于缩略图宽,原图高大于缩略图高

elseif($this->rWidth < $this->tWidth && $this->rHeight > $this->tHeight){

$mid = ($this->rHeight - $this->tHeight) / $this->rHeight; //高缩小的比例

$this->width = $this->rWidth - floor($this->rWidth * $mid);

$this->height = $this->rHeight - floor($this->rHeight * $mid);

$x = ($this->tWidth - $this->width) / 2;

$y = ($this->tHeight - $this->height) / 2;

}

//原图宽大于缩略图宽,原图高小于缩略图高

elseif($this->rWidth > $this->tWidth && $this->rHeight < $this->tHeight){

$mid = ($this->rWidth - $this->tWidth) / $this->rWidth; //宽缩小的比例

$this->width = $this->rWidth - floor($this->rWidth * $mid);

$this->height = $this->rHeight - floor($this->rHeight * $mid);

$x = ($this->tWidth - $this->width) / 2;

$y = ($this->tHeight - $this->height) / 2;

}

else{

throw new Exception('Resize error');

}

//给缩略图添加白色背景

$bg = imagecolorallocate($new_pic, 255, 255, 255);

imagefill($new_pic, 0, 0, $bg);

//缩小原始图片到新建图片

imagecopyresampled($new_pic, $source_pic, $x, $y, 0, 0, $this->width, $this->height, $this->rWidth, $this->rHeight);

//输出缩略图到文件

imagepng($new_pic, $this->name.'.png');

imagedestroy($new_pic);

imagedestroy($source_pic);

}

catch(Exception $e){

$msg = 'class ' . __CLASS__ . ' Error:' . $e->getMessage();

echo $msg;

exit;

}

}

}

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com

特别注意:本站所有转载文章言论不代表本站观点!

本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值