注意: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/ 我从这边谷歌字体下载的
标签:二维码,value,qrImage,CMYK,hyperf,new,bgImage From: https://www.cnblogs.com/sdfgdrg/p/18263387