注意: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/ 我從這邊谷歌字型下載的