建站之图片缩略图

难点在于,gif 图片直接截缩略图可能有巨大噪音,所以改为截取第一帧。

//生成缩略图
public static function createThumb($imagePath)
{
    try {
        if (!($imagePath = File::exist($imagePath))) {
            return false;
        }

        if (is_mobile()) {
            //移动端生成更小的图
            $path = $imagePath . '_s.jpg';
            $maxWidth = 147;
        } else {
            $path = $imagePath . '_m.jpg';
            $maxWidth = 294;
        }
        $maxHeight = 500;

        $imagick = new Imagick($imagePath);
        $width = $imagick->getImageWidth();
        $height = $imagick->getImageHeight();

        while (1) {
            if ($maxWidth < $width) {
                $height = $height * $maxWidth / $width;
                $width = $maxWidth;
            } elseif ($maxHeight < $height) {
                $width = $width * $maxHeight / $height;
                $height = $maxHeight;
            } else {
                break;
            }
        }

        if (GIF == strtolower($imagick->getImageFormat()) && 400 > $imagick->count()) {
            //截取 gif 第一帧
            foreach ($imagick->coalesceImages() as $frame) {
                $tmp = new Imagick();
                $tmp->readImageBlob($frame);
                $imagick = $tmp;
                break;
            }
        }

        $imagick->thumbnailImage(format_integer($width), 0);
        $imagick->setImageCompressionQuality(60);
        $imagick->writeImage($path);
        $imagick->destroy();
        if (isset($tmp)) {
            $tmp->destroy();
        }

        return $path;
    } catch (Exception $e) {
    }
}
2017 年 5 月 18 日 晚上
添加