注:此功能依赖gd2图形库
最近要用php生成缩略图,在网上找了一下,发现了这篇文章:PHP生成图片缩略图
试用了一下后,发现有这样几个问题:
1、png图片生成的缩略图是jpg格式的
2、png图片生成的缩略图没有了透明(半透明)效果(填充了黑色背景)
立即学习“PHP免费学习笔记(深入)”;
3、代码语法比较老
因此,在这个版本的基础上简单修改优化了一下。
<?<span>php
</span><span>/*</span><span>
* desc: Resize Image(png, jpg, gif)
* author: 十年后的卢哥哥(http://www.cnblogs.com/lurenjiashuo/)
* date: 2014.11.13
* base from: http://www.oschina.net/code/snippet_5189_2491
</span><span>*/</span>
<span>class</span><span> ResizeImage {
</span><span>//</span><span>图片类型</span>
<span>private</span> <span>$type</span><span>;
</span><span>//</span><span>实际宽度</span>
<span>private</span> <span>$width</span><span>;
</span><span>//</span><span>实际高度</span>
<span>private</span> <span>$height</span><span>;
</span><span>//</span><span>改变后的宽度</span>
<span>private</span> <span>$resize_width</span><span>;
</span><span>//</span><span>改变后的高度</span>
<span>private</span> <span>$resize_height</span><span>;
</span><span>//</span><span>是否裁图</span>
<span>private</span> <span>$cut</span><span>;
</span><span>//</span><span>源图象</span>
<span>private</span> <span>$srcimg</span><span>;
</span><span>//</span><span>目标图象地址</span>
<span>private</span> <span>$dstimg</span><span>;
</span><span>//</span><span>临时创建的图象</span>
<span>private</span> <span>$im</span><span>;
</span><span>function</span> __construct(<span>$imgPath</span>, <span>$width</span>, <span>$height</span>, <span>$isCut</span>, <span>$savePath</span><span>) {
</span><span>$this</span>->srcimg = <span>$imgPath</span><span>;
</span><span>$this</span>->resize_width = <span>$width</span><span>;
</span><span>$this</span>->resize_height = <span>$height</span><span>;
</span><span>$this</span>->cut = <span>$isCut</span><span>;
</span><span>//</span><span>图片的类型</span>
<span>$this</span>->type = <span>strtolower</span>(<span>substr</span>(<span>strrchr</span>(<span>$this</span>->srcimg,"."),1<span>));
</span><span>//</span><span>初始化图象</span>
<span>$this</span>-><span>initi_img();
</span><span>//</span><span>目标图象地址</span>
<span>$this</span> -> dst_img(<span>$savePath</span><span>);
</span><span>//</span><span>--</span>
<span>$this</span>->width = imagesx(<span>$this</span>-><span>im);
</span><span>$this</span>->height = imagesy(<span>$this</span>-><span>im);
</span><span>//</span><span>生成图象</span>
<span>$this</span>-><span>newimg();
ImageDestroy (</span><span>$this</span>-><span>im);
}
</span><span>private</span> <span>function</span><span> newimg() {
</span><span>//</span><span>改变后的图象的比例</span>
<span>$resize_ratio</span> = (<span>$this</span>->resize_width)/(<span>$this</span>-><span>resize_height);
</span><span>//</span><span>实际图象的比例</span>
<span>$ratio</span> = (<span>$this</span>->width)/(<span>$this</span>-><span>height);
</span><span>if</span>(<span>$this</span>-><span>cut) {
</span><span>//</span><span>裁图</span>
<span>$newimg</span> = imagecreatetruecolor(<span>$this</span>->resize_width,<span>$this</span>-><span>resize_height);
</span><span>if</span>(<span>$this</span>->type=="png"<span>) {
imagefill(</span><span>$newimg</span>, 0, 0, imagecolorallocatealpha(<span>$newimg</span>, 0, 0, 0, 127<span>));
}
</span><span>if</span>(<span>$ratio</span>>=<span>$resize_ratio</span><span>) {
</span><span>//</span><span>高度优先</span>
imagecopyresampled(<span>$newimg</span>, <span>$this</span>->im, 0, 0, 0, 0, <span>$this</span>->resize_width,<span>$this</span>->resize_height, ((<span>$this</span>->height)*<span>$resize_ratio</span>), <span>$this</span>-><span>height);
} </span><span>else</span><span> {
</span><span>//</span><span>宽度优先</span>
imagecopyresampled(<span>$newimg</span>, <span>$this</span>->im, 0, 0, 0, 0, <span>$this</span>->resize_width, <span>$this</span>->resize_height, <span>$this</span>->width, ((<span>$this</span>->width)/<span>$resize_ratio</span><span>));
}
} </span><span>else</span><span> {
</span><span>//</span><span>不裁图</span>
<span>if</span>(<span>$ratio</span>>=<span>$resize_ratio</span><span>) {
</span><span>$newimg</span> = imagecreatetruecolor(<span>$this</span>->resize_width,(<span>$this</span>->resize_width)/<span>$ratio</span><span>);
</span><span>if</span>(<span>$this</span>->type=="png"<span>) {
imagefill(</span><span>$newimg</span>, 0, 0, imagecolorallocatealpha(<span>$newimg</span>, 0, 0, 0, 127<span>));
}
imagecopyresampled(</span><span>$newimg</span>, <span>$this</span>->im, 0, 0, 0, 0, <span>$this</span>->resize_width, (<span>$this</span>->resize_width)/<span>$ratio</span>, <span>$this</span>->width, <span>$this</span>-><span>height);
} </span><span>else</span><span> {
</span><span>$newimg</span> = imagecreatetruecolor((<span>$this</span>->resize_height)*<span>$ratio</span>,<span>$this</span>-><span>resize_height);
</span><span>if</span>(<span>$this</span>->type=="png"<span>) {
imagefill(</span><span>$newimg</span>, 0, 0, imagecolorallocatealpha(<span>$newimg</span>, 0, 0, 0, 127<span>));
}
imagecopyresampled(</span><span>$newimg</span>, <span>$this</span>->im, 0, 0, 0, 0, (<span>$this</span>->resize_height)*<span>$ratio</span>, <span>$this</span>->resize_height, <span>$this</span>->width, <span>$this</span>-><span>height);
}
}
</span><span>if</span>(<span>$this</span>->type=="png"<span>) {
imagesavealpha(</span><span>$newimg</span>, <span>true</span><span>);
imagepng (</span><span>$newimg</span>,<span>$this</span>-><span>dstimg);
} </span><span>else</span><span> {
imagejpeg (</span><span>$newimg</span>,<span>$this</span>-><span>dstimg);
}
}
</span><span>//</span><span>初始化图象</span>
<span>private</span> <span>function</span><span> initi_img() {
</span><span>if</span>(<span>$this</span>->type=="jpg"<span>) {
</span><span>$this</span>->im = imagecreatefromjpeg(<span>$this</span>-><span>srcimg);
}
</span><span>if</span>(<span>$this</span>->type=="gif"<span>) {
</span><span>$this</span>->im = imagecreatefromgif(<span>$this</span>-><span>srcimg);
}
</span><span>if</span>(<span>$this</span>->type=="png"<span>) {
</span><span>$this</span>->im = imagecreatefrompng(<span>$this</span>-><span>srcimg);
}
}
</span><span>//</span><span>图象目标地址</span>
<span>private</span> <span>function</span> dst_img(<span>$dstpath</span><span>) {
</span><span>$full_length</span> = <span>strlen</span>(<span>$this</span>-><span>srcimg);
</span><span>$type_length</span> = <span>strlen</span>(<span>$this</span>-><span>type);
</span><span>$name_length</span> = <span>$full_length</span>-<span>$type_length</span><span>;
</span><span>$name</span> = <span>substr</span>(<span>$this</span>->srcimg,0,<span>$name_length</span>-1<span>);
</span><span>$this</span>->dstimg = <span>$dstpath</span><span>;
}
}
</span>?>使用时,直接调用类的构造函数即可,构造函数如下:
<span>$resizeimage</span> = <span>new</span> resizeimage($imgPath, $width, $height, $isCut, $savePath);
$imgPath:原图片地址
$width:缩略图宽
$height:缩略图高
$isCut:是否裁剪,bool值
$savePath:缩略图地址(可以跟原图片地址相同)
<?<span>php
</span><span>include</span> "ResizeImage.php"<span>;
</span><span>//</span><span>jpg</span>
<span>$jpgResize</span> = <span>new</span> ResizeImage("img/test_1920_1200.jpg", 320, 240, <span>false</span>, "img/test_320_240.jpg"<span>);
</span><span>//</span><span>png</span>
<span>$pngResize</span> = <span>new</span> ResizeImage("img/test_1024_746.png", 320, 240, <span>false</span>, "img/test_320_240.png"<span>);
</span>?>

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号