内容简介:好久没发文章了,最近登录看到有朋友评论了golang生成二维码的文章,想了解下生成个性二维码的解决方案!实现思路 ,网上搜相关资料几乎没有, 没有那就就自己想吧,就去看了下草料二维码;然后突然就有感觉了 不就是把像素的颜色替换嘛 这还不简单
前言
好久没发文章了,最近登录看到有朋友评论了golang生成二维码的文章,想了解下生成个性二维码的解决方案!
实现思路 ,网上搜相关资料几乎没有, 没有那就就自己想吧,就去看了下草料二维码;
然后突然就有感觉了 不就是把像素的颜色替换嘛 这还不简单
1 打开二维码图片
2 打开要填充的图片
3 将要填充的图片剪裁成和二维码一样大小
4 分析二维码的每个像素 替换成图片的像素就行了
以下是生成的例子:
例子
代码
package main import ( "fmt" "github.com/nfnt/resize" "image" "image/color" "image/draw" "log" "os" "time" _ "image/jpeg" _ "image/gif" "image/png" ) func main() { // 打开二维码图片 qrFile, err := os.Open("img/qr.png") if err != nil { log.Fatalf("打开二维码失败 %s", err.Error()) return } defer qrFile.Close() // 将二维码文件接码成图片 img, _, err := image.Decode(qrFile) if err != nil { log.Fatalf("image decode error %s", err.Error()) return } // 获取二维码的宽高 width, height := img.Bounds().Max.X, img.Bounds().Max.Y // 打开要填充的图片 bgFile, err := os.Open("bg/7.jpg") if err != nil { log.Fatalf("打开填充图失败 %s", err.Error()) return } defer bgFile.Close() // 将填充图解码成png图片 bgImg, _, err := image.Decode(bgFile) if err != nil { log.Fatalf("填充图解码失败 %s", err.Error()) return } // 获取填充图的宽高 bgWidth, bgHeight := bgImg.Bounds().Max.X, bgImg.Bounds().Max.Y // 检测二维码和填充图宽高是否一致 if width != bgWidth || height != bgHeight { // 如果不一致将填充图剪裁 bgImg = ImageResize(bgImg, width, height) } // 开始填充二维码 for y := 0; y < img.Bounds().Max.X; y++ { for x := 0; x < img.Bounds().Max.X; x++ { qrImgColor := img.At(x, y) // 检测图片颜色 如果rgb值是 255 255 255 255 则像素点为白色 跳过 // 如果rgba值是 0 0 0 0 则为透明色 跳过 switch img.(type) { case *image.NRGBA: c := qrImgColor.(color.NRGBA) if (c.R == 0 && c.G == 0 && c.B == 0 && c.A == 0) || (c.R == 255 && c.G == 255 && c.B == 255 && c.A == 255) { continue } case *image.RGBA: c := qrImgColor.(color.RGBA) if (c.R == 0 && c.G == 0 && c.B == 0 && c.A == 0) || (c.R == 255 && c.G == 255 && c.B == 255 && c.A == 255) { continue } } // 获取要填充的图片的颜色 bgImgColor := bgImg.At(x, y) // 填充颜色 switch bgImg.(type) { case *image.RGBA64: c := bgImgColor.(color.RGBA64) img.(draw.Image).Set(x, y, color.RGBA64{R: c.R, G: c.G, B: c.B, A: c.A}) case *image.NRGBA: c := bgImgColor.(color.NRGBA) img.(draw.Image).Set(x, y, color.NRGBA{R: c.R, G: c.G, B: c.B, A: c.A}) case *image.RGBA: c := bgImgColor.(color.RGBA) img.(draw.Image).Set(x, y, color.RGBA{R: c.R, G: c.G, B: c.B, A: c.A}) case *image.YCbCr: c := bgImgColor.(color.YCbCr) img.(draw.Image).Set(x, y, color.YCbCr{Y: c.Y, Cb: c.Cb, Cr: c.Cr}) default: fmt.Println("error") } } } filename := fmt.Sprintf("%s.png", time.Now().Format("20060102150405")) // 写入文件 outFile, err := os.Create(filename) if err != nil { log.Fatal(err) } defer outFile.Close() _ = png.Encode(outFile, img) } func ImageResize(src image.Image, w, h int) image.Image { return resize.Resize(uint(w), uint(h), src, resize.Lanczos3) }
注意
1 尽量用png的二维码和填充图
2 案例中png和jpg gif图片都可以填充 其他格式的图片自己加就行了
代码地址
https://github.com/lihaotian0607/qr
欢迎关注我们的微信公众号,每天学习 Go 知识
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Advanced Web Metrics with Google Analytics
Brian Clifton / Sybex / 2008 / USD 39.99
Are you getting the most out of your website? Google insider and web metrics expert Brian Clifton reveals the information you need to get a true picture of your site's impact and stay competitive usin......一起来看看 《Advanced Web Metrics with Google Analytics》 这本书的介绍吧!