thinkphp 二维码生成,并带有logo


public static function getQRCode($device_code=0)
    {
        //生成当前的二维码
        $qrCode = new \Endroid\QrCode\QrCode();
        //想显示在二维码中的文字内容,这里设置了一个查看文章的地址
        $url = Url("api/test/coin",["money"=>"2","device_code"=>$device_code],"html",true);
        $qrCode->setText($url)
            ->setSize(300)
            ->setPadding(10)
            ->setErrorCorrection('high')
            ->setForegroundColor(array('r' => 0, 'g' => 0, 'b' => 0, 'a' => 0))
            ->setBackgroundColor(array('r' => 255, 'g' => 255, 'b' => 255, 'a' => 0))
            ->setImageType(\Endroid\QrCode\QrCode::IMAGE_TYPE_PNG);

        header('Content-Type: '.$qrCode->getContentType());
        //$qrCode->render();
        $qrCode->save('images/qrcode.png');
        return compromises_image();
    }

由于二维码允许有一定的容错性,一般的二维码即使在遮住部分但仍然能够解码,经常我们扫描二维码的时候扫描到甚至不到一半时就能解码扫描结果,这是因为生成器会将部分信息重复表示来提高其容错度,这就是为什么我们在二维码中间加个LOGO图片并不影响解码结果的原因。

//图片合并,
function compromises_image(){
    header("content-type:image/png");
    $imxx = ImageCreateFrompng("images/qrcode.png");
    imagesavealpha($imxx, true);
    $im = imagecreatetruecolor(imagesx($imxx), imagesy($imxx));
    $im1 = ImageCreateFrompng("images/logo.png");
    imagecopy($im, $imxx, 0, 0, 0, 0, imagesx($imxx), imagesy($imxx));
    imagecopyresampled($im,$im1,imagesx($im)/2-imagesx($im1)/6,imagesy($im)/2-imagesy($im1)/6,0,0,intval(imagesx($im1)/3),intval(imagesy($im1)/3),imagesx($im1),imagesy($im1));
    $filename = "images/".md5(rand(1,10000).time()).".jpg";
    imagepng($im,$filename);
    ImageDestroy($im);
    return $filename;
}