hyperf 生成二维码并且转为CMYK色彩通道的图片

注意:CMYK色彩通道的图片格式需要为 JPEG 或 TIFF ,png是不支持CMYK的,不然转换的话会转换会srgb或Gray

使用前先安装imagick拓展
1 {
2     "require": {
3         "ext-imagick": "*"
4     }
5 }

 

 
 1 public function createQrcode($data): void
 2     {
 3         // 设置文本字体和大小
 4         $fontFile = 'public/RobotoSlab-VariableFont_wght.ttf'; // 请提供一个实际的字体文件路径
 5         $fontSize = 20;
 6         // 创建 ImagickDraw 对象
 7         $draw = new ImagickDraw();
 8         $draw->setFont($fontFile);
 9         $draw->setFontSize($fontSize);
10 
11         foreach ($data as $index => $value) {
12             // 生成二维码
13             $qrCode = Builder::create()
14                 ->writer(new PngWriter())
15                 ->writerOptions([])
16                 ->data($value['code'])
17                 ->encoding(new Encoding('UTF-8'))
18                 ->size(260)
19                 ->margin(10)
20                 ->validateResult(false)
21                 ->build();
22 
23             // 创建保存二维码的目录
24             $batchDir = "public/qrcode/batch_{$value['batch_id']}";
25             if (!is_dir($batchDir)) {
26                 mkdir($batchDir, 0755, true); // 递归创建目录
27             }
28 
29             // 创建一个空白的 Imagick 对象作为背景
30             $bgImage = new Imagick();
31             $bgImage->newImage(400, 400, new ImagickPixel('white'));
32 
33             // 从二维码数据中创建一个新的 Imagick 对象
34             $qrImage = new Imagick();
35             $qrImage->readImageBlob($qrCode->getString());
36 
37             // 计算二维码放置位置使其居中
38             $qrWidth = $qrImage->getImageWidth();
39             $qrHeight = $qrImage->getImageHeight();
40             $qrX = (400 - $qrWidth) / 2;
41             $qrY = (400 - $qrHeight) / 2 - 20; // 稍微偏上
42 
43             // 将二维码图像拷贝到背景图上
44             $bgImage->compositeImage($qrImage, Imagick::COMPOSITE_OVER, $qrX, $qrY);
45 
46             // 释放二维码图像资源
47             $qrImage->clear();
48             $qrImage->destroy();
49 
50             // 获取文本框的尺寸
51             $metrics = $bgImage->queryFontMetrics($draw, $value['code']);
52             $textWidth = $metrics['textWidth'];
53             $textX = (400 - $textWidth) / 2;
54             $textY = $qrY + $qrHeight + 40;
55 
56             // 添加文本到背景图上
57             $bgImage->annotateImage($draw, $textX, $textY, 0, $value['code']);
58 
59             // 将图像转换为 CMYK 色彩模式
60             $bgImage->transformImageColorspace(Imagick::COLORSPACE_CMYK);
61 
62             // 保存最终图像到文件
63             $file = "{$batchDir}/{$value['code']}.jpeg"; // 使用索引作为文件名
64             $bgImage->setImageFormat('jpeg');
65             $bgImage->writeImage($file);
66 
67             // 释放背景图像资源
68             $bgImage->clear();
69             $bgImage->destroy();
70 
71             echo "生成二维码成功:{$file}<br>";
72         }
73 
74         // 释放 ImagickDraw 对象
75         $draw->destroy();
76     }

 字体文件:https://fonts.google.com/  我从这边谷歌字体下载的

posted @ 2024-06-23 13:54  CFFIRM  阅读(3)  评论(0编辑  收藏  举报