getBgImg($template); $items = array_filter($template->value, function ($item) { return $item['type'] != 'bg'; }); $array = array_filter($template->value, function ($item) { return $item['type'] == 'bg'; }); $array = array_shift($array); // 按照模型比列修改image $items = (function()use($items,$img,$array){ $heightScale = $img->getHeight() / $array['height']; $weightScale = $img->getWidth() / $array['width']; foreach ($items as $key=>&$item) { if(array_key_exists('width',$item)) $item['width'] = intval($weightScale * floatval($item['width'])); if(array_key_exists('height',$item)) $item['height'] = intval($heightScale * floatval($item['height'])) ; if(array_key_exists('left',$item)) $item['left'] = intval($weightScale * floatval($item['left'])); if(array_key_exists('top',$item)) $item['top'] =intval( $heightScale * floatval($item['top'])); if(array_key_exists('font-size',$item)) $item['font-size'] = intval($heightScale * floatval($item['font-size'])); if(array_key_exists('border-width',$item)) $item['border-width'] = intval($heightScale * floatval($item['border-width'])); $item['heightScale'] = $heightScale; $item['weightScale'] = $weightScale; } return $items; })(); usort($items, function ($a, $b) { return $a['z_index'] > $b['z_index'] ? 1 : -1; }); foreach ($items as $item) { switch ($item['type']) { case 'textBox': $this->setTextBox($img, $item, null); break; case 'image': $this->setImage($img, $item); break; case 'qRCode': $this->setQRCode($img, $item, null); break; case 'stripeCode': $this->setStripeCode($img, $item, null); break; default: break; } } return $img; } private function getBgImg($template): \Intervention\Image\Image { $bg = array_filter($template->value, function ($item) { return $item['type'] == 'bg'; }); $values = array_shift($bg); return Image::canvas($values['width'], $values['height'], '#fff'); } public function setTextBox($image, $params, $orderPackages): \Intervention\Image\Image { $bgImage = Image::canvas($params['width'], $params['height'], '#000'); $img = $this->getTextBox($params, $orderPackages['text']); $bgImage = $bgImage->insert($img, 'top-left', $params['border-width'], $params['border-width']); return $image->insert($bgImage, 'top-left', $params['left'] ?? 0, $params['top'] ?? 0); } public function setStripeCode($img, $params, $orderPackages) { $bgImage = Image::canvas(404 , 92, '#fff'); $item = [ 'width' => 404, 'height' => 20, 'justify-content' => 'center', 'align-items' => 'center', 'text' => 1231313, 'border-width' => 0, 'top' => 58, 'left' => 0, 'font-size' => 20 ]; $textBox = $this->getTextBox($item, '123123'); $bgImage->insert($textBox, 'top-left', 0, 68); $generatorPng = new BarcodeGeneratorJPG(); $barCode = $generatorPng->getBarcode('0123456789', $generatorPng::TYPE_CODE_128_A, 1, 50); $stripeCode = Image::make($barCode)->resize(382, 50); $bgImage->insert($stripeCode, 'top-left', 6, 9)->resize(404 * $params['scale'] * $params['weightScale'], 92 * $params['scale'] * $params['heightScale']); return $img->insert($bgImage, 'top-left', $params['left'], $params['top']); } public function setImage($img, $params) { $printPartImage = PrintPartImage::query()->where('name', $params['text'])->first(); $path = ['app', 'public']; $path = join(DIRECTORY_SEPARATOR, $path); $dirPath = storage_path($path); $uri = $printPartImage->file['url']; $uri = str_replace('/', DIRECTORY_SEPARATOR, $uri); $path = $dirPath . $uri . '.' . $printPartImage->file['type']; $image = Image::make(File::get($path)); $image->resize($params['width'], $params['height']); $img->insert($image, 'top-left', $params['left'], $params['top']); return $img; } public function getTextBox($params, $text): \Intervention\Image\Image { $bgImg = Image::canvas($params['width'], $params['height'], '#fff'); if ($params['border-width'] !== 0) { $borderWidth = $params['border-width'] * 2; $paddingBgImage = Image::canvas($params['width'], $params['height'], '#000'); $paddingImage = Image::canvas($params['width'] - $borderWidth, $params['height'] - $borderWidth, '#fff'); $paddingBgImage->insert($paddingImage, 'top-left', intval($params['border-width'] / 2), intval($params['border-width'] / 2)); $bgImg->insert($paddingBgImage); } $path_arr = ['fonts', 'simsun.ttc']; $x = $params['width'] / 2; if ($params['justify-content'] == 'center') $x = $params['width'] / 2; if ($params['justify-content'] == 'flex-start') $x = $params['width'] / 2; $y = $params['height'] / 2; if ($params['align-items'] == 'center') $y = $params['height'] / 2; if ($params['align-items'] == 'flex-start') $y = 0; if ($params['align-items'] == 'flex-end') $y = ($params['height'] - 22) / 2; // 字体路径 $path = app('path.public') . (DIRECTORY_SEPARATOR . join(DIRECTORY_SEPARATOR, $path_arr)); $aligns = [ 'flex-start' => 'right', 'center' => 'center' ]; $vAligns = [ 'center' => 'center', 'flex-start' => 'top', 'flex-end' => 'bottom', ]; return $bgImg->text('0123456789', intval($x), intval($y), function ($font) use ($params, $path, $aligns, $vAligns) { $font->file($path); $font->size($params['font-size'] ?? 24); $font->align($aligns[$params['justify-content']]); // 水平对齐方式 // center // right $font->valign($vAligns[$params['align-items']]); // 垂直对齐方式 // center // middle // top // bottom }); } public function setQRCode($img, $params, $orderPackages) { $text = $params['text']; $qrCode = new QrCode($text ?? '123'); $qrCode->setSize(100); $qrCode->setMargin(0); $scale = $params['scale'] ?? 1; return $img->insert(Image::make($qrCode->writeString())->resize(100 * $scale * $params['weightScale'], 100 * $scale * $params['heightScale']), 'top-left', $params['left'], $params['top'] ); } public function getImage($base64, &$path): \Intervention\Image\Image { $path = $this->getImagePath(); $img = Image::make($base64); $img->save($path); // 图片保存 return $img; } private function getImagePath(){ $img_name = Str::uuid() . '.png'; $path_arr = ['app', 'public', 'print']; $dir_path = implode(DIRECTORY_SEPARATOR, $path_arr); if (!file_exists(storage_path($dir_path))) mkdir(storage_path($dir_path)); $path_arr[] = 'image'; $dir_path = implode(DIRECTORY_SEPARATOR, $path_arr); if (!file_exists(storage_path($dir_path))) mkdir(storage_path($dir_path)); $path_arr[] = $img_name; return storage_path(implode(DIRECTORY_SEPARATOR, $path_arr)); } public function saveImage($image,&$path){ $path = $this->getImagePath(); $image->save($path); // 图片保存 } public function readImageBase64($path): string { if ($fp = fopen($path,"rp",0)){ $gambar = fread($fp,filesize($path)); fclose($fp); return chunk_split(base64_encode($gambar)); } return ""; } }