DrawImage.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. namespace App\Traits;
  3. use App\PrintPartImage;
  4. use Endroid\QrCode\QrCode;
  5. use Illuminate\Support\Facades\File;
  6. use Illuminate\Support\Str;
  7. use Intervention\Image\Facades\Image;
  8. use Picqer\Barcode\BarcodeGeneratorJPG;
  9. trait DrawImage
  10. {
  11. public function draw($orderPackage, $template, $img = null)
  12. {
  13. if (!$img) $img = $this->getBgImg($template);
  14. $items = array_filter($template->value, function ($item) {
  15. return $item['type'] != 'bg';
  16. });
  17. usort($items, function ($a, $b) {
  18. return $a['z_index'] > $b['z_index'] ? 1 : -1;
  19. });
  20. foreach ($items as $item) {
  21. switch ($item['type']) {
  22. case 'textBox':
  23. $this->setTextBox($img, $item, null);
  24. break;
  25. case 'image':
  26. $this->setImage($img, $item);
  27. break;
  28. case 'qRCode':
  29. $this->setQRCode($img, $item, null);
  30. break;
  31. case 'stripeCode':
  32. $this->setStripeCode($img, $item, null);
  33. break;
  34. default:
  35. break;
  36. }
  37. }
  38. return $img;
  39. }
  40. private function getBgImg($template): \Intervention\Image\Image
  41. {
  42. $bg = array_filter($template->value, function ($item) {
  43. return $item['type'] == 'bg';
  44. });
  45. $values = array_shift($bg);
  46. return Image::canvas($values['width'], $values['height'], '#fff');
  47. }
  48. public function setTextBox($image, $params, $orderPackages): \Intervention\Image\Image
  49. {
  50. $bgImage = Image::canvas($params['width'], $params['height'], '#000');
  51. $img = $this->getTextBox($params, $orderPackages['text']);
  52. $bgImage = $bgImage->insert($img, 'top-left', $params['border-width'], $params['border-width']);
  53. return $image->insert($bgImage, 'top-left', $params['left'] ?? 0, $params['top'] ?? 0);
  54. }
  55. public function setStripeCode($img, $params, $orderPackages)
  56. {
  57. $bgImage = Image::canvas(404, 92, '#fff');
  58. $item = [
  59. 'width' => 404, 'height' => 20,
  60. 'justify-content' => 'center', 'align-items' => 'center',
  61. 'text' => 1231313, 'border-width' => 0,
  62. 'top' => 58, 'left' => 0, 'font-size' => 20
  63. ];
  64. $textBox = $this->getTextBox($item, '123123');
  65. $bgImage->insert($textBox, 'top-left', 0, 68);
  66. $generatorPng = new BarcodeGeneratorJPG();
  67. $barCode = $generatorPng->getBarcode('0123456789', $generatorPng::TYPE_CODE_128_A, 1, 50);
  68. $stripeCode = Image::make($barCode)->resize(382, 50);
  69. $bgImage->insert($stripeCode, 'top-left', 6, 9)->resize(404 * $params['scale'], 92 * $params['scale']);
  70. return $img->insert($bgImage, 'top-left', $params['left'], $params['top']);
  71. }
  72. public function setImage($img, $params)
  73. {
  74. $printPartImage = PrintPartImage::query()->where('name', $params['text'])->first();
  75. $path = ['app', 'public'];
  76. $path = join(DIRECTORY_SEPARATOR, $path);
  77. $dirPath = storage_path($path);
  78. $uri = $printPartImage->file['url'];
  79. $uri = str_replace('/', DIRECTORY_SEPARATOR, $uri);
  80. $path = $dirPath . $uri . '.' . $printPartImage->file['type'];
  81. $image = Image::make(File::get($path));
  82. $image->resize($params['width'], $params['height']);
  83. $img->insert($image, 'top-left', $params['left'], $params['top']);
  84. return $img;
  85. }
  86. public function getTextBox($params, $text): \Intervention\Image\Image
  87. {
  88. $bgImg = Image::canvas($params['width'], $params['height'], '#fff');
  89. if ($params['border-width'] !== 0) {
  90. $borderWidth = $params['border-width'] * 2;
  91. $paddingBgImage = Image::canvas($params['width'], $params['height'], '#000');
  92. $paddingImage = Image::canvas($params['width'] - $borderWidth, $params['height'] - $borderWidth, '#fff');
  93. $paddingBgImage->insert($paddingImage, 'top-left', intval($params['border-width'] / 2), intval($params['border-width'] / 2));
  94. $bgImg->insert($paddingBgImage);
  95. }
  96. $path_arr = ['fonts', 'simsun.ttc'];
  97. $x = $params['width'] / 2;
  98. if ($params['justify-content'] == 'center') $x = $params['width'] / 2;
  99. if ($params['justify-content'] == 'flex-start') $x = $params['width'] / 2;
  100. $y = $params['height'] / 2;
  101. if ($params['align-items'] == 'center') $y = $params['height'] / 2;
  102. if ($params['align-items'] == 'flex-start') $y = 0;
  103. if ($params['align-items'] == 'flex-end') $y = ($params['height'] - 22) / 2;
  104. // 字体路径
  105. $path = app('path.public') . (DIRECTORY_SEPARATOR . join(DIRECTORY_SEPARATOR, $path_arr));
  106. $aligns = [
  107. 'flex-start' => 'right',
  108. 'center' => 'center'
  109. ];
  110. $vAligns = [
  111. 'center' => 'center',
  112. 'flex-start' => 'top',
  113. 'flex-end' => 'bottom',
  114. ];
  115. return $bgImg->text('0123456789', intval($x), intval($y), function ($font) use ($params, $path, $aligns, $vAligns) {
  116. $font->file($path);
  117. $font->size($params['font-size'] ?? 24);
  118. $font->align($aligns[$params['justify-content']]); // 水平对齐方式
  119. // center
  120. // right
  121. $font->valign($vAligns[$params['align-items']]); // 垂直对齐方式
  122. // center
  123. // middle
  124. // top
  125. // bottom
  126. });
  127. }
  128. public function setQRCode($img, $params, $orderPackages)
  129. {
  130. $text = $params['text'];
  131. $qrCode = new QrCode($text ?? '123');
  132. $qrCode->setSize(100);
  133. $qrCode->setMargin(0);
  134. $scale = $params['scale'] ?? 1;
  135. return $img->insert(Image::make($qrCode->writeString())->resize(100 * $scale, 100 * $scale), 'top-left', $params['left'], $params['top']);
  136. }
  137. public function getImage($base64, &$path): \Intervention\Image\Image
  138. {
  139. $img_name = Str::uuid() . '.png';
  140. $path_arr = ['app', 'public', 'print'];
  141. $dir_path = implode(DIRECTORY_SEPARATOR, $path_arr);
  142. if (!file_exists(storage_path($dir_path))) mkdir(storage_path($dir_path));
  143. $path_arr[] = 'image';
  144. $dir_path = implode(DIRECTORY_SEPARATOR, $path_arr);
  145. if (!file_exists(storage_path($dir_path))) mkdir(storage_path($dir_path));
  146. $path_arr[] = $img_name;
  147. $path = storage_path(implode(DIRECTORY_SEPARATOR, $path_arr));
  148. $img = Image::make($base64);
  149. $img->save($path); // 图片保存
  150. return $img;
  151. }
  152. }