首頁  >  文章  >  php教程  >  php生成图片缩略图,支持png透明,

php生成图片缩略图,支持png透明,

WBOY
WBOY原創
2016-06-13 09:21:18948瀏覽

php生成图片缩略图,支持png透明,

注:此功能依赖GD2图形库

最近要用php生成缩略图,在网上找了一下,发现了这篇文章:PHP生成图片缩略图

试用了一下后,发现有这样几个问题:

1、png图片生成的缩略图是jpg格式的

2、png图片生成的缩略图没有了透明(半透明)效果(填充了黑色背景)

3、代码语法比较老

因此,在这个版本的基础上简单修改优化了一下。

PHP生成缩略图类

<?<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>?>

效果

  

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn