硬汉工作室

搜索
热搜: 活动 交友 discuz

[开发资料] discuz png图片上传后过大的处理方法

[复制链接]
发表于 2022-1-14 16:43:38 | 显示全部楼层 |阅读模式
一个几十K的png图片,上传之后变成了几百K,这让很多站长无法接受,某位站长出资让我研究,有一些成果,分享出来

上传前png图片位深度是8位的,但是上传后位深度变成了24位了,这应该是导致图片变大的原因。
我是改的source/class/class_image.php文件,里面有个Thumb_GD方法,修改后的方法是:
function Thumb_GD() {
        if(!function_exists('imagecreatetruecolor') || !function_exists('imagecopyresampled') || !function_exists('imagejpeg') || !function_exists('imagecopymerge')) {
                return -4;
        }
        $imagefunc = &$this->imagefunc;
        $attach_photo = $this->loadsource();
        if($attach_photo < 0) {
                return $attach_photo;
        }
        $copy_photo = imagecreatetruecolor($this->imginfo['width'], $this->imginfo['height']);
        //log3($this->imginfo);
        imagecopy($copy_photo, $attach_photo ,0, 0, 0, 0, $this->imginfo['width'], $this->imginfo['height']);
        $attach_photo = $copy_photo;
        $thumb_photo = null;
        log3($this->param, 1);

        switch($this->param['thumbtype']) {
                case 'fixnone':
                case 1:
                        if($this->imginfo['width'] >= $this->param['thumbwidth'] || $this->imginfo['height'] >= $this->param['thumbheight']) {
                                $thumb = array();
                                list(,,$thumb['width'], $thumb['height']) = $this->sizevalue(0);
                                $cx = $this->imginfo['width'];
                                $cy = $this->imginfo['height'];
                                $thumb_photo = imagecreatetruecolor($thumb['width'], $thumb['height']);

                                $bga = imagecolorallocatealpha($thumb_photo, 0, 0, 0, 127); // 加粗部分就是新增的代码
                                imagecolortransparent($thumb_photo, $bga);
                                imagefill($thumb_photo, 0, 0, $bga);

                                imagecopyresampled($thumb_photo, $attach_photo ,0, 0, 0, 0, $thumb['width'], $thumb['height'], $cx, $cy);

                                imagetruecolortopalette($thumb_photo, false, 32); // 32这个值越小,图片越小,但是越模糊
                                imagesavealpha($thumb_photo, true);
                        }
                        break;
                case 'fixwr':
                case 2:
                        if(!($this->imginfo['width'] <= $this->param['thumbwidth'] || $this->imginfo['height'] <= $this->param['thumbheight'])) {
                                list($startx, $starty, $cutw, $cuth) = $this->sizevalue(1);
                                $dst_photo = imagecreatetruecolor($cutw, $cuth);
                                imagecopymerge($dst_photo, $attach_photo, 0, 0, $startx, $starty, $cutw, $cuth, 100);
                                $thumb_photo = imagecreatetruecolor($this->param['thumbwidth'], $this->param['thumbheight']);
                                imagecopyresampled($thumb_photo, $dst_photo ,0, 0, 0, 0, $this->param['thumbwidth'], $this->param['thumbheight'], $cutw, $cuth);
                        } else {
                                $thumb_photo = imagecreatetruecolor($this->param['thumbwidth'], $this->param['thumbheight']);
                                $bgcolor = imagecolorallocate($thumb_photo, 255, 255, 255);
                                imagefill($thumb_photo, 0, 0, $bgcolor);
                                $startx = ($this->param['thumbwidth'] - $this->imginfo['width']) / 2;
                                $starty = ($this->param['thumbheight'] - $this->imginfo['height']) / 2;
                                imagecopymerge($thumb_photo, $attach_photo, $startx, $starty, 0, 0, $this->imginfo['width'], $this->imginfo['height'], 100);
                        }
                        break;
        }
        clearstatcache();
        if($thumb_photo) {
                if($this->imginfo['mime'] == 'image/jpeg') {
                        @$imagefunc($thumb_photo, $this->target, $this->param['thumbquality']);
                } else {
                        @$imagefunc($thumb_photo, $this->target);
                }
                return 1;
        } else {
                return 0;
        }
}


我用的gd库,dz后台选的,然后thumbtype是1,这个应该对应dz后台的下图设置:
2022-01-14_163953.png
当然了,只有你选择了直接缩放原图这个选项,并且论坛帖子附件缩略图设置值为不启用本代码才会生效,其它情况可以联系我处理。

我只测试的png,估计jpg也会受影响的。

有关PHP系统、Discuz或网站等各种问题,可以联系QQ1069971363寻求付费支持
Discuz插件商店:http://addon.dismall.com/?@56030.developer
回复

使用道具 举报

QQ|Archiver|手机版|小黑屋|硬汉工作室 ( 冀ICP备13021567号-9 )

GMT+8, 2024-4-26 01:39 , Processed in 0.056392 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表