hyperf 生成二維碼並且轉為CMYK色彩通道的圖片

CFFIRM發表於2024-06-23
注意: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/ 我從這邊谷歌字型下載的

相關文章