config = $config; } /** * @return BlockImage */ public function makeBlockImage(): BlockImage { $data = new BlockData(); $image = new BlockImage(); $this->setCommon($image, $data); $this->setBlock($image, $data); return $image; } /** * @return WordImage */ public function makeWordImage(): WordImage { $data = new WordData(); $image = new WordImage(); $this->setCommon($image, $data); $this->setWord($image, $data); return $image; } /** * 设置公共配置 * @param BaseImage $image * @param BaseData $data */ protected function setCommon(BaseImage $image, BaseData $data) { //固定驱动,少量图片处理场景gd性能远远大于imagick ImageManagerStatic::configure(['driver' => 'gd']); //获得字体数据 $fontFile = $data->getFontFile($this->config['font_file']); $image ->setFontFile($fontFile) ->setWatermark($this->config['watermark']); } /** * 设置滑动验证码的配置 * @param BlockImage $image * @param BlockData $data */ protected function setBlock(BlockImage $image, BlockData $data) { //设置背景 $backgroundVo = $data->getBackgroundVo($this->config['block_puzzle']['backgrounds']); $image->setBackgroundVo($backgroundVo); $templateVo = $data->getTemplateVo($backgroundVo, $this->config['block_puzzle']['templates']); $image->setTemplateVo($templateVo); $pixelMaps = [$backgroundVo, $templateVo]; if ( isset($this->config['block_puzzle']['is_interfere']) && $this->config['block_puzzle']['is_interfere'] == true ) { $interfereVo = $data->getInterfereVo($backgroundVo, $templateVo, $this->config['block_puzzle']['templates']); $image->setInterfereVo($interfereVo); $pixelMaps[] = $interfereVo; } if ( isset($this->config['block_puzzle']['is_cache_pixel']) && $this->config['block_puzzle']['is_cache_pixel'] === true ) { $cache = $this->getCacheInstance(); foreach ($pixelMaps as $vo) { /**@var ImageVo $vo * */ $key = 'image_pixel_map_' . $vo->src; $result = $cache->get($key); if (!empty($result) && is_array($result)) { $vo->setPickMaps($result); } else { $vo->preparePickMaps(); $vo->setFinishCallback(function (ImageVo $imageVo) use ($cache, $key) { $cache->set($key, $imageVo->getPickMaps(), 0); }); } } } } /** * 设置文字验证码的配置 * @param WordImage $image * @param WordData $data */ protected function setWord(WordImage $image, WordData $data) { //设置背景 $backgroundVo = $data->getBackgroundVo($this->config['click_world']['backgrounds']); $image->setBackgroundVo($backgroundVo); //随机文字坐标 $pointList = $data->getPointList( $image->getBackgroundVo()->image->getWidth(), $image->getBackgroundVo()->image->getHeight(), 3 ); $worldList = $data->getWordList(count($pointList)); $image ->setWordList($worldList) ->setWordList($worldList) ->setPoint($pointList); } /** * 创建缓存实体 */ public function getCacheInstance(): Cache { if (empty($this->cacheInstance)) { $this->cacheInstance = new Cache($this->config['cache']); } return $this->cacheInstance; } public function makeWordData(): WordData { return new WordData(); } public function makeBlockData(): BlockData { return (new BlockData())->setFaultOffset($this->config['block_puzzle']['offset']); } }