December 14, 2013

让织梦缩略图自适应裁剪

Ecjtu.net有三个页面需要调用同一个文章的缩略图,但大小比例都不一样。用如下方法实现缩略图自动裁切。

需要PHP安装GD库,http://www.php.net/manual/zh/intro.image.php

代码

/include/extend.func.php里添加thumb()函数:

function thumb($imgurl, $width, $height)
{
    global $cfg_mainsite,$cfg_multi_site;
    $thumb = eregi("http://",$imgurl)?str_replace($cfg_mainsite,'',$imgurl):$imgurl; 
    list($thumbname,$extname) = explode('.',$thumb);
    $newthumb = $thumbname.'_'.$width.'_'.$height.'.'.$extname;
    if(!$thumbname || !$extname || !file_exists(DEDEROOT.$thumb)) return $imgurl;
    if(!file_exists(DEDEROOT.$newthumb))
    {
        include_once DEDEINC.'/image.func.php';
        $src_im = imagecreatefromjpeg(DEDEROOT.$thumb);
        $dst_im = imagecreatetruecolor($width, $height);
        $width_im = imagesx($src_im);
        $height_im = imagesy($src_im);
        if($width_im/$height_im < $width/$height)
        {
            $tmp = ($height_im-$width_im*($height/$width))/2;
            imagecopyresampled($dst_im, $src_im, 0, 0, 0, $tmp, $width, $height, $width_im, $height_im - $tmp*2);
        }
        else
        {
            $tmp = ($width_im-$height_im*($width/$height))/2;
            imagecopyresampled($dst_im, $src_im, 0, 0, $tmp, 0, $width, $height, $width_im - $tmp*2, $height_im);
        }
        imagejpeg($dst_im, DEDEROOT.$newthumb, 100);
        imagedestroy($dst_im);
        imagedestroy($src_im);
    }
    return $cfg_multi_site=='Y'?$cfg_mainsite.$newthumb:$newthumb;
}

调用

在任何调用缩略图的时候:

[field:picname function='thumb(@me,590,310)'/]
第二个第三个参数分别为宽高

规则

调用缩略图的时候首先查看缩略图目录是否有相应大小裁切过的图片,有就直接返回,没有就在同目录下生成并返回。
生成的缩略图命名规则:

原缩略图名_宽_高.xxx
例:142_1321254421_590_310.jpg

裁切规则:

  • 保持需要的比例
  • 尽可能大的保留图片
  • 超出尺寸部分裁剪两边保留中间

注意

相应尺寸的缩略图生成之后就永远不会被改变,因此某些特殊情况下可能需要你手动删除。