Discuz!官方免费开源建站系统

 找回密码
 立即注册
搜索

[修改] 解决无论图片大小都会生成缩略图的问题修改

[复制链接]
fareign 发表于 2013-12-15 23:45:32 | 显示全部楼层 |阅读模式
分析:
function Thumb($source, $target, $thumbwidth, $thumbheight, $thumbtype = 1, $nosuffix = 0) {
                $return = $this->init('thumb', $source, $target, $nosuffix);
                if($return <= 0) {
                        return $this->returncode($return);
                }

                if($this->imginfo['animated']) {
                        return $this->returncode(0);
                }
                $this->param['thumbwidth'] = intval($thumbwidth);
                if(!$thumbheight || $thumbheight > $this->imginfo['height']) {
                        $thumbheight = $thumbwidth > $this->imginfo['width'] ? $this->imginfo['height'] : $this->imginfo['height']*($thumbwidth/$this->imginfo['width']);
                }
//在这里重新定义的 $thumbheight 的值,只要缩略图的高度大于图片的高度,就对他进行了重新定义。那么我们看看他是怎么重新定义的。
条件:缩略图的高度大于图片的高度


定义条件:
1.如果缩略图的宽度大于图片的宽度,缩略图的高度就等于图片的高度。
(导致结果:本来缩略图的宽度大于图片的宽度,就有可能不需要生成缩略图,但这里人为的使缩略图的高度=图片的高度,因此满足生成缩略图的条件。)
2.如果缩略图的宽度小于图片的宽度,缩略图的高度=图片的高度*缩略图的宽度/图片的宽度(因为缩略图的宽度小于图片的宽度为前提,固此值小于1
因此缩略图的高度会小于图片的高度
(导致结果:缩略图的宽度小于图片的宽度,就应该生成缩略图,无论高度如何。)


所以会产生,无论图片大小,都会生成缩略图。


                $this->param['thumbheight'] = intval($thumbheight);
                $this->param['thumbtype'] = $thumbtype;
                if($thumbwidth < 100 && $thumbheight < 100) {
                        $this->param['thumbquality'] = 100;
                }

                $return = !$this->libmethod ? $this->Thumb_GD() : $this->Thumb_IM();
                $return = !$nosuffix ? $return : 0;

                return $this->sleep($return);
        }



执行函数

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']);
                imagecopy($copy_photo, $attach_photo ,0, 0, 0, 0, $this->imginfo['width'], $this->imginfo['height']);
                $attach_photo = $copy_photo;

                $thumb_photo = null;
                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']);
                                        imagecopyresampled($thumb_photo, $attach_photo ,0, 0, 0, 0, $thumb['width'], $thumb['height'], $cx, $cy);
                                }



解决办法
这里要重新定义缩略图的高度是有目的,不会把太长的图片缩小后,宽度变的太小,然后无法阅读。其目的是为了调整到与宽度比等高后再进行缩略图的工作。
这里错就错在,应该是
$thumbheight < $this->imginfo['height']  而不是大于






把 if(!$thumbheight || $thumbheight > $this->imginfo['height']) {  的大于号改成小于号。











回复

使用道具 举报

1314学习网 发表于 2013-12-16 08:29:40 | 显示全部楼层
支持下分享。。。
回复

使用道具 举报

lgx.cc 发表于 2013-12-16 08:46:28 | 显示全部楼层
很好 支持下
回复

使用道具 举报

 楼主| fareign 发表于 2013-12-18 11:06:38 | 显示全部楼层
同样,这个问题也导致了封面设置的问题。

本来说封面 ”当版块开启图片列表模式时有效,0或不填 将根据原图高度按比例生成,封面高度不同,有瀑布流的效果“ 但要设置成99999才可以。改过来之后,就可以按要求设置了。
回复

使用道具 举报

 楼主| fareign 发表于 2013-12-19 09:26:30 | 显示全部楼层
好吧,我相信你的程序都没这个问题。就我一个人的有。
回复

使用道具 举报

脚滑的狐狸 发表于 2014-10-14 23:03:01 | 显示全部楼层
我还以为是BUG 这个图片类可以升级了
回复

使用道具 举报

脚滑的狐狸 发表于 2014-10-15 00:41:01 | 显示全部楼层
想来想这不是BUG
故意这么做的,这类应该就是来生成各种大小的图片的,不一定要是缩略图
回复

使用道具 举报

 楼主| fareign 发表于 2014-10-16 07:18:01 | 显示全部楼层
脚滑的狐狸 发表于 2014-10-15 00:41
想来想这不是BUG
故意这么做的,这类应该就是来生成各种大小的图片的,不一定要是缩略图

是就是生成各种大小的图片。但是,如果图片小于你设定的尺寸,还生成一张一样尺寸图片就没有任何意义了。只有大于你设定的尺寸,才生成你设定的尺寸的图片,才能缓解服务器压力。
回复

使用道具 举报

脚滑的狐狸 发表于 2014-10-16 09:31:56 | 显示全部楼层
fareign 发表于 2014-10-16 07:18
是就是生成各种大小的图片。但是,如果图片小于你设定的尺寸,还生成一张一样尺寸图片就没有任何意义了。 ...

不同项目需求不同
回复

使用道具 举报

 楼主| fareign 发表于 2014-10-16 17:40:22 | 显示全部楼层
本帖最后由 fareign 于 2014-10-16 17:54 编辑

上传一张800*800的图片,变成两张800*800,你还认为是不同的需求,只能说你赢了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-9-10 22:01 , Processed in 0.127895 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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