一个几十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后台的下图设置:
当然了,只有你选择了直接缩放原图这个选项,并且论坛帖子附件缩略图设置值为不启用本代码才会生效,其它情况可以联系我处理。
我只测试的png,估计jpg也会受影响的。
有关PHP系统、Discuz或网站等各种问题,可以联系QQ1069971363寻求付费支持
|
|