欢迎光临《小雷的网站》
加入收藏 | 设为首页 | 联系我们
小雷的网站
游客,您好!
请使用QQ先登陆
  • 最新公告:如果有什么问题,请大家联系客服处理.客服在线时间:12:00-23:59 其它时间段请留言.
  • 博文详细内容

    PHP生成图片缩略图的方法
    资讯栏目:技术文摘 | 发布者:小雷 | 关注度:1058次 | 发布时间:2018-10-21 17:57:53

    功能:支持jpg,jpeg,gif,png,bmp图片格式,支持按原图片的比例进行缩放,可以选择在图片缩放的过程中是否需要对图片进行裁切,加入了图片质量控制,可以实现缩略图片质量最高化。完整类的代码如下:

    <?php
    /**
     * 功能:php生成缩略图片的类
     */
    class ResizeImage {
        public $type; //图片类型
        public $width; //实际宽度
        public $height; //实际高度
        public $resize_width; //改变后的宽度
        public $resize_height; //改变后的高度
        public $cut; //是否裁图
        public $srcimg; //源图象
        public $dstimg; //目标图象地址
        public $im; //临时创建的图象
        public $quality; //图片质量
        function resizeimage($img, $wid, $hei, $c, $dstpath, $quality = 100) {
            $this->srcimg = $img;
            $this->resize_width = $wid;
            $this->resize_height = $hei;
            $this->cut = $c;
            $this->quality = $quality;
            $this->type = strtolower(substr(strrchr($this->srcimg, '.'), 1)); //图片的类型
            $this->initi_img(); //初始化图象
            $this->dst_img($dstpath); //目标图象地址
            @$this->width = imagesx($this->im);
            @$this->height = imagesy($this->im);
            $this->newimg(); //生成图象
            @ImageDestroy($this->im);
        }
        function newimg() {
            $resize_ratio = ($this->resize_width) / ($this->resize_height); //改变后的图象的比例
            @$ratio = ($this->width) / ($this->height); //实际图象的比例
            if (($this->cut) == '1') { //裁图
                if ($img_func === 'imagepng' && (str_replace('.', '', PHP_VERSION) >= 512)) { //针对php版本大于5.12参数变化后的处理情况
                    $quality = 9;
                }
                if ($ratio >= $resize_ratio) { //高度优先
                    $newimg = imagecreatetruecolor($this->resize_width, $this->resize_height);
                    imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, $this->resize_height, (($this->height) * $resize_ratio), $this->height);
                    imagejpeg($newimg, $this->dstimg, $this->quality);
                }
                if ($ratio < $resize_ratio) { //宽度优先
                    $newimg = imagecreatetruecolor($this->resize_width, $this->resize_height);
                    imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, $this->resize_height, $this->width, (($this->width) / $resize_ratio));
                    imagejpeg($newimg, $this->dstimg, $this->quality);
                }
            } else { //不裁图
                if ($ratio >= $resize_ratio) {
                    $newimg = imagecreatetruecolor($this->resize_width, ($this->resize_width) / $ratio);
                    imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, ($this->resize_width) / $ratio, $this->width, $this->height);
                    imagejpeg($newimg, $this->dstimg, $this->quality);
                }
                if ($ratio < $resize_ratio) {
                    @$newimg = imagecreatetruecolor(($this->resize_height) * $ratio, $this->resize_height);
                    @imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, ($this->resize_height) * $ratio, $this->resize_height, $this->width, $this->height);
                    @imagejpeg($newimg, $this->dstimg, $this->quality);
                }
            }
        }
        function initi_img() { //初始化图象
            if ($this->type == 'jpg' || $this->type == 'jpeg') {
                $this->im = imagecreatefromjpeg($this->srcimg);
            }
            if ($this->type == 'gif') {
                $this->im = imagecreatefromgif($this->srcimg);
            }
            if ($this->type == 'png') {
                $this->im = imagecreatefrompng($this->srcimg);
            }
            if ($this->type == 'wbm') {
                @$this->im = imagecreatefromwbmp($this->srcimg);
            }
            if ($this->type == 'bmp') {
                $this->im = $this->ImageCreateFromBMP($this->srcimg);
            }
        }
        function dst_img($dstpath) { //图象目标地址
            $full_length = strlen($this->srcimg);
            $type_length = strlen($this->type);
            $name_length = $full_length - $type_length;
            $name = substr($this->srcimg, 0, $name_length - 1);
            $this->dstimg = $dstpath;
            //echo $this->dstimg;
            
        }
        function ImageCreateFromBMP($filename) { //自定义函数处理bmp图片
            if (!$f1 = fopen($filename, "rb")) returnFALSE;
            $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1, 14));
            if ($FILE['file_type'] != 19778) returnFALSE;
            $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel' . '/Vcompression/Vsize_bitmap/Vhoriz_resolution' . '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1, 40));
            $BMP['colors'] = pow(2, $BMP['bits_per_pixel']);
            if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
            $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel'] / 8;
            $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
            $BMP['decal'] = ($BMP['width'] * $BMP['bytes_per_pixel'] / 4);
            $BMP['decal']-= floor($BMP['width'] * $BMP['bytes_per_pixel'] / 4);
            $BMP['decal'] = 4 - (4 * $BMP['decal']);
            if ($BMP['decal'] == 4) $BMP['decal'] = 0;
            $PALETTE = array();
            if ($BMP['colors'] < 16777216) {
                $PALETTE = unpack('V' . $BMP['colors'], fread($f1, $BMP['colors'] * 4));
            }
            $IMG = fread($f1, $BMP['size_bitmap']);
            $VIDE = chr(0);
            $res = imagecreatetruecolor($BMP['width'], $BMP['height']);
            $P = 0;
            $Y = $BMP['height'] - 1;
            while ($Y >= 0) {
                $X = 0;
                while ($X < $BMP['width']) {
                    if ($BMP['bits_per_pixel'] == 24) $COLOR = unpack("V", substr($IMG, $P, 3) . $VIDE);
                    elseif ($BMP['bits_per_pixel'] == 16) {
                        $COLOR = unpack("n", substr($IMG, $P, 2));
                        $COLOR[1] = $PALETTE[$COLOR[1] + 1];
                    } elseif ($BMP['bits_per_pixel'] == 8) {
                        $COLOR = unpack("n", $VIDE . substr($IMG, $P, 1));
                        $COLOR[1] = $PALETTE[$COLOR[1] + 1];
                    } elseif ($BMP['bits_per_pixel'] == 4) {
                        $COLOR = unpack("n", $VIDE . substr($IMG, floor($P), 1));
                        if (($P * 2) % 2 == 0) $COLOR[1] = ($COLOR[1] >> 4);
                        else $COLOR[1] = ($COLOR[1] & 0x0F);
                        $COLOR[1] = $PALETTE[$COLOR[1] + 1];
                    } elseif ($BMP['bits_per_pixel'] == 1) {
                        $COLOR = unpack("n", $VIDE . substr($IMG, floor($P), 1));
                        if (($P * 8) % 8 == 0) $COLOR[1] = $COLOR[1] >> 7;
                        elseif (($P * 8) % 8 == 1) $COLOR[1] = ($COLOR[1] & 0x40) >> 6;
                        elseif (($P * 8) % 8 == 2) $COLOR[1] = ($COLOR[1] & 0x20) >> 5;
                        elseif (($P * 8) % 8 == 3) $COLOR[1] = ($COLOR[1] & 0x10) >> 4;
                        elseif (($P * 8) % 8 == 4) $COLOR[1] = ($COLOR[1] & 0x8) >> 3;
                        elseif (($P * 8) % 8 == 5) $COLOR[1] = ($COLOR[1] & 0x4) >> 2;
                        elseif (($P * 8) % 8 == 6) $COLOR[1] = ($COLOR[1] & 0x2) >> 1;
                        elseif (($P * 8) % 8 == 7) $COLOR[1] = ($COLOR[1] & 0x1);
                        $COLOR[1] = $PALETTE[$COLOR[1] + 1];
                    } else returnFALSE;
                    imagesetpixel($res, $X, $Y, $COLOR[1]);
                    $X++;
                    $P+= $BMP['bytes_per_pixel'];
                }
                $Y--;
                $P+= $BMP['decal'];
            }
            fclose($f1);
            return $res;
        }
    }
    ?>

    使用方法很简单代码如下:

    $resizeimage=new ResizeImage('upload/abc.bmp', '120', '90', '0', 'upload/xabc.bmp');

    需要注意的是,如果在根目录的话,图片地址前面不要加"/"。要不是生成不了。

    而且本代码的使用方式稍微开发一下,可以做批量生成缩略图用,生成速度超快。


    转载请注:小雷的网站 http://www.leihx.com/news/37.html
    评论

    您还没有登陆,请登陆后再评论吧!
    本站只支持QQ登陆,请不要发布不当的以及违反国家法律的言论!
    版权信息:@2018-2025 www.leihx.com 网站访问量:5352561人次 互联网ICP备案:黔ICP备15016820号-4
    联系地址:贵州省铜仁市碧江区川硐教育园区 合作咨询:400-180-5676 (周一至周五 9:00-18:00)