无法使用下面的文字创建QR

时间:2017-07-06 15:31:49

标签: php api imagecreatefrompng

我使用此代码制作带有自定义文字的qr代码。我尝试了几种方法,但我总是失败。我需要帮助。

// Set the content-type
header('Content-Type: image/png');
header("Content-Disposition: filename='sample.png'");
$main = imagecreatetruecolor(150, 180);
$qr = imagecreatefrompng("https://api.qrserver.com/v1/create-qr-code/?size=150x150&format=png&margin=5&data=sample");
// Create the image
$im = imagecreatetruecolor(150, 30);
// Create some colors
$black = imagecolorallocate($im, 255, 255, 255);
imagefilledrectangle($im, 0, 0, 399, 29, $black);
// Font path
$font = 'arial.ttf';
// Add the text
imagettftext($im, 20, 0, 5, 25, $black, $font, 'sample');
imagecopymerge_alpha($main, $qr, 0, 0, 0, 0, 150, 150, 100);
imagecopymerge_alpha($main, $im, 0, 150, 0, 0, 150, 30, 100);
imagepng($main);
imagedestroy($main);

我只看到空白页。

1 个答案:

答案 0 :(得分:2)

您收到了错误消息,但是您无法在浏览器中查看该错误,因为您已设置<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.css"> <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-animate.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-aria.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-messages.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.js"></script> <script data-require="jquery@*" data-semver="2.0.3" src="http://code.jquery.com/jquery-2.0.3.min.js"></script> <script data-require="bootstrap@3.1.1" data-semver="3.1.1" src="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script> </head> <body> <div data-ng-app="myApp"> <div data-ng-controller="myCtrl"> <h1>{{hello}}</h1> <md-toolbar class="md-warn"> <div class="md-toolbar-tools"> <h2 class="md-flex">HTML 5</h2> </div> </md-toolbar> </div> </div> <script> var app = angular.module('myApp', ['ngMaterial']); app.controller('myCtrl', function($scope, $http) { $scope.hello = "Hello Plunker!"; }); </script> </body> </html>,因此调试时只需注释掉该行或检查您的服务器日志。

我提醒的第一件事是this answer使用字体的相对路径。这足以发出警告,如果输出到屏幕会使您的图像混乱,更不用说您没有获得所需的字体。我会fix this line

Content-Type: image/png

对我来说,致命的错误是:

  

调用未定义的函数imagecopymerge_alpha()

我不确定你在哪里获得该代码,但我发现this question所以我认为它可能是相关的。

$font = realpath(__DIR__.'/arial.ttf');

然后我注意到白色被标记为黑色,并设置为背景和文本颜色 - 所以无论它是什么颜色,它都不可见。所以我changed these lines。 (function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){ // creating a cut resource $cut = imagecreatetruecolor($src_w, $src_h); // copying relevant section from background to the cut resource imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h); // copying relevant section from watermark to the cut resource imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h); // insert cut resource to destination image imagecopymerge($dst_im, $cut, $dst_x, $dst_y, 0, 0, $src_w, $src_h, $pct); } 表示已删除的行,-表示已添加的行。)

+

最后,不是硬编码单词 // Create the image $im = imagecreatetruecolor(150, 30); // Create some colors -$black = imagecolorallocate($im, 255, 255, 255); +$white = imagecolorallocate($im, 255, 255, 255); +$black = imagecolorallocate($im, 0, 0, 0); imagefilledrectangle($im, 0, 0, 399, 29, $black); // Font path $font = realpath(__DIR__.'/arial.ttf'); // Add the text -imagettftext($im, 20, 0, 5, 25, $black, $font, 'sample'); +imagettftext($im, 20, 0, 5, 25, $white, $font, 'sample'); imagecopymerge_alpha($main, $qr, 0, 0, 0, 0, 150, 150, 100); imagecopymerge_alpha($main, $im, 0, 150, 0, 0, 150, 30, 100); imagepng($main); ,而是为了好玩,我将其设置为查询字符串。

sample
  

GET /

sample qr

  

GET /?qr =你好

hello qr

+$text = $_GET['qr'] ?? 'sample';
+
 // Set the content-type
 header('Content-Type: image/png');
 header("Content-Disposition: filename='sample.png'");
 $main = imagecreatetruecolor(150, 180);
-$qr = imagecreatefrompng("https://api.qrserver.com/v1/create-qr-code/?size=150x150&format=png&margin=5&data=sample");
+$qr = imagecreatefrompng("https://api.qrserver.com/v1/create-qr-code/?size=150x150&format=png&margin=5&data=$text");
 // Create the image
 $im = imagecreatetruecolor(150, 30);
 // Create some colors
@@ -14,7 +16,7 @@ imagefilledrectangle($im, 0, 0, 399, 29, $black);
 // Font path
 $font = realpath(__DIR__.'/arial.ttf');
 // Add the text
-imagettftext($im, 20, 0, 5, 25, $white, $font, 'sample');
+imagettftext($im, 20, 0, 5, 25, $white, $font, $text);