首先我们要有背景图和logo图。另外,必须要有QRcode类库。这个我就不多说了。我在百度上查了很多。准备好这些内容,我们就开始写代码吧。生成二维码:首先,我们需要使用QRcode类库来生成原始二维码。我们来看看QRcode的一些参数。我们一般使用QRcode的png()方法来生成二维码。我们不会在这里讨论其他格式。png()方法有6个参数:第一个:$text生成的二维码中包含的信息。第二个:$outputPaht默认,不生成文件,这是生成二维码的路径L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%);第四种:$size,控制生成图片的大小,默认为4第五种:$margin,控制生成二维码空白区域的大小第六种:$saveandprint,保存二维码图片并显示,以及$outfile必须传递图像路径。了解了这些参数后,我们可以做一个简单的设置:$text="ThisisjustatestQRcode!";$QRDir="./base.png";//生成图片的路径$errorCorrectionLevel='H';//容错率$matrixPointSize=10;//生成图片的大小$margin=2;至于第六个参数,我们不需要设置,实际项目中也不需要打印图像。此图片通常设置为下载。这里我就不细说了。$qrCode=newQRcode();$qrCode->png($text,$QRDir,$errorCorrectionLevel,$matrixPointSize,$margin);通过以上操作,我们生成了一个二维码,二维码的内容保存在base.png图片中。如果获取二维码很简单,那么上面的操作就达到了目的。但是只有一个二维码有点难看。在实际项目中,需要对这个二维码进行美化,添加一些我们需要的背景和logo。接下来我们对二维码做进一步的处理,让二维码更加美观。我的实际项目中有两种情况,一种是生成没有logo的二维码,一种是生成有logo的二维码。先说一下无logo二维码的生成:由于我们生成的二维码可能无法100%放入我们预设的背景图片中:(当然也可以在制作背景图片的时候用measurethesize,只是把二维码放到背景图片里),这里需要说明什么是100%放入背景图片,即生成的二维码和后台预留的二维码,空白处可以直接关闭,因为背景有时会发生变化,而生成的二维码大小是固定的,所以不能满足我们的需求。当遇到上述不断变化的背景图片时,需要对生成的二维码进行处理,对生成的二维码进行放大或缩小。需要简单介绍几个图像处理函数:imagecreatefromgif():创建画布并从GIF文件或URL加载图像imagecreatefromjpeg():创建画布并从JPEG文件或URL地址加载图像imagecreatefrompng():创建一个canvasandloadanimagefromaPNGfileorURLimagecreatefromwbmp():创建画布并从WBMP文件或URL加载图像imagecreatefromstring():创建画布并从URL加载图像流中的字符串创建一个新的image使用上面的函数读取生成的二维码图片,得到二维码的高和宽。$QRImageInfo=imagecreatefromspng($QRDir);$QR_width=imagesx($QRImageInfo);$QR_height=imagesy($QRImageInfo);然后创建我们需要大小的图片:使用imagecreatetruecolor()方法创建图片资源,使用imagecolorallocate()方法,为图片设置背景色$width=539;$身高=539;$newImage=imagecreatetruecolor($width,$height);//创建图片资源$newImage_white=imagecolorallocate($newImage,255,255,255);//为创建的图片资源设置白色背景imagefill($newImage,0,0,$newImage_white);//填充$newImage然后使用imagecopyresized()函数将二维码图片缩放到新建的图片imagecopyresized()函数有10个参数:1.要放置的新图片资源(目标图片资源)dst_im2,待缩放图片资源(原图资源)src_im3,目标图片起始x坐标dst_x4,目标图片起始y坐标dst_y5,原图起始x坐标src_x6,原图起始y坐标src_y7,目标图片的宽度dst_w8,目标图片的高度dst_h9,原图的宽度src_w10,原图的高度src_h根据以上参数,我们就可以将二维码图片放入新建的图片中在:imagecopyresized($newImage,$QRImageInfo,0,0,0,0,539,539,$QR_width,$QR_height);生成的$newImage是缩放的QR码。下一步是将缩放后的二维码放在已经设计好的底图之上。imagecopyresampled函数和上面imagecopyresized的效果是一样的,但是这个函数的效果比imagecopyresized要好。参数也是一样的。$backgroundDir="./background.png";//准备好的背景图片$backgroundImg=imagecreatefromspng($backgroundDir);imagecopyresampled($backgroundImg,$newImage,203,330,0,0,539,539,539,539);最后保存合并后的图片:$resultPngPic="./resultPngPicWithoutLogo.png";//设置最终生成图片的路径imagepng($backgroundImg,$resultPngPic);imagedestroy($newImage);//销毁$newImage资源中间创建的会在当前目录下得到一张名为resultPngPicWithoutLogo.png的图片,图片内容就是我们想要的二维码图片。接下来就是生成带logo的二维码了:生成带logo的二维码的思路和上面没有logo的二维码是一样的,就是把我们需要的图片放大,然后将二维码中的图片组合成一个带有logo的二维码,然后将这个二维码放到背景图片中。这里的操作和上面完全一样。这里重点介绍如何实现图片的圆角设置,如下图所示:在生成带有logo的二维码时,我们也希望logo也是圆角的,这点和二维码是一样的微信和支付宝。首先打开准备好的logo图片:$logoDir="./logo.png";$resource=imagecreatefrompng($logoDir);$image_width=imagesx($resource);$image_height=imagesy($resource);创建一个与当前图像大小相同的画布:$targetImg=imagecreatetruecolor($logo_width,$logo_height);imagesavealpha($targetImg,true);//保留图片的透明通道$targetImgBackground=imagecolorallocatealpha($targetImg,255,255,255,127);//设置目标图片为透明背景imagefill($targetImg,0,0,$targetImgBackground);//填充透明背景下一步是在目标图像上绘制logo图像:这里有两种方法,第一种比较灵活,但是效率低:是判断每个像素点是否落在我们想要的范围,如果落在我们想要的范围内,就在画布上绘制像素,重复这个过程,直到所有的像素都遍历完。这样,我们就相当于裁剪了一张新的图片。这种方法可以裁剪任何图片,只要你能判断好像素点就可以了。但缺点是效率太低。所有的像素都需要遍历一次,画布需要多次修改才能得到最终的图片。如果是专业需要,牺牲一些性能是可以接受的。但我们只需要一个带有圆角的简单图像。这样的需求根本不需要遍历所有的像素点。第二种方法是我们可以创建一个小正方形并将这个小的规则形状切割成扇形。这样,切出的扇形就会与原图结合,形成圆角图。但是这里有一个问题。得到的圆角图片只是形式上是圆的,圆角外面是一圈背景,不是透明的。先看第二种方法:$r=$radius;//圆角半径函数litter_corner($radius){$img=imagecreatetruecolor($radius,$radius);imagesavealpha($img,true);$bgcolor=imagecolorallocatealpha($img,0,0,0,127);$fgcolor=imagecolorallocate($img,0,0,0);imagefill($img,0,0,$bgcolor);imagefilledarc($img,$radius,$radius,$radius*2,$radius*2,180,270,$fgcolor,IMG_ARC_PIE);图像颜色透明($img,$fgcolor);return$img;}//lt(左上角)$lt_corner=litter_corner($radius);imagecopymerge($resource,$lt_corner,0,0,0,0,$radius,$radius,100);//lb(左下角)$lb_corner=imagerotate($lt_corner,90,0);imagecopymerge($resource,$lb_corner,0,$image_height-$radius,0,0,$radius,$radius,100);//rb(右上角)$rb_corner=imagerotate($lt_corner,180,0);imagecopymerge($resource,$rb_corner,$image_width-$radius,$image_height-$radius,0,0,$radius,$radius,100);//rt(右下角)$rt_corner=imagerotate($lt_corner,270),0);图片复制合并($资源ce,$rt_corner,$image_width-$radius,0,0,0,$radius,$radius,100);$image="logoFinal.png";imagepng($资源,$图像);这样会得到一个带有背景色的A圆角logo,但是这种方法并没有得到透明的图片。待会再研究一下,看能不能弄个透明的图片,达到想要的效果。第二种方法是获取透明背景的圆角logo图片,代码如下:(这段代码是从网上找的,基本思路是通过计算像素的位置来判断是否显示,并保留image质点得到的最终图像)functionradius_img($imgpath,$radius=15){$ext=pathinfo($imgpath);$src_img=null;开关($ext['extension']){case'jpg':$src_img=imagecreatefromjpeg($imgpath);休息;case'png':$src_img=imagecreatefrompng($imgpath);休息;}$wh=getimagesize($imgpath);$w=$wh[0];$h=$wh[1];//$radius=$radius==0?(min($w,$h)/2):$半径;$img=imagecreatetruecolor($w,$h);//这句话必须Thereisimagesavealpha($img,true);//取一个全透明的颜色,最后一个参数127全透明$bg=imagecolorallocatealpha($img,255,255,255,127);imagefill($img,0,0,$bg);$r=$半径;//角半径for($x=0;$x<$w;$x++){for($y=0;$y<$h;$y++){$rgbColor=imagecolorat($src_img,$x,$y);if(($x>=$radius&&$x<=($w-$radius))||($y>=$radius&&$y<=($h-$radius))){//不在四个角的范围,直接绘制imagesetpixel($img,$x,$y,$rgbColor);}else{//选择在四个角的范围内绘制//左上$y_x=$r;//中心X坐标$y_y=$r;//中心Y坐标if(((($x-$y_x)*($x-$y_x)+($y-$y_y)*($y-$y_y))<=($r*$r))){imagesetpixel($img,$x,$y,$rgbColor);}//右上角$y_x=$w-$r;//中心X坐标$y_y=$r;//中心Y坐标if(((($x-$y_x)*($x-$y_x)+($y-$y_y)*($y-$y_y))<=($r*$r))){imagesetpixel($img,$x,$y,$rgbColor);}//左下角$y_x=$r;//中心X坐标$y_y=$h-$r;//中心Y坐标if(((($x-$y_x)*($x-$y_x)+($y-$y_y)*($y-$y_y))<=($r*$r))){imagesetpixel($img,$x,$y,$rgbColor);}//右下角$y_x=$w-$r;//中心X坐标$y_y=$h-$r;//中心Y坐标if(((($x-$y_x)*($x-$y_x)+($y-$y_y)*($y-$y_y))<=($r*$r))){imagesetpixel($img,$x,$y,$rgbColor);}}}}返回$img;}$final_logo=radius_img($resource);imagepng($final_logo,"logoFinal.png");通过调用这个函数,我们可以很容易的得到一个透明的圆角logo,其实很简单,但是相对来说,比上面的合成图要麻烦一些。最后,这个已经被修改了。logo图片贴在二维码中间。这可能会涉及到图片的大小,可以通过对之前的图片进行缩放得到一个理想的大小。合成代码如下:$QR=imagecreatefrompng("qr.png");//这里的qr.png是二维码的图片$logo=imagecreatefrompng("logoFinal.png");//圆角的二维码logo$QR_width=imagesx($QR);//二维码图片宽度$QR_height=imagesy($QR);//二维码图片高度$logo_width=imagesx($logo);//logo图片宽度$logo_height=imagesy($logo);//logo图片高度$logo_qr_width=$QR_width/5;$scale=$logo_width/$logo_qr_width;$logo_qr_height=$logo_height/$scale;$from_width=($QR_width-$logo_qr_width)/2;//重新组合图像并调整大小;$QRHasLogo="QRHasLogo.png";//最终结果二维码imagepng($QR,$QRHasLogo)withlogo;这样你就会得到一张名为QRHasLogo.png的图片,然后把这张图片贴在背景上就大功告成了。最后一步和上面没有logo的二维码一样,所以不用设置。最终结果如下(编码):
