golang 生成个性二维码

栏目: IT技术 · 发布时间: 4年前

内容简介:好久没发文章了,最近登录看到有朋友评论了golang生成二维码的文章,想了解下生成个性二维码的解决方案!实现思路 ,网上搜相关资料几乎没有, 没有那就就自己想吧,就去看了下草料二维码;然后突然就有感觉了 不就是把像素的颜色替换嘛 这还不简单

前言

好久没发文章了,最近登录看到有朋友评论了golang生成二维码的文章,想了解下生成个性二维码的解决方案!

实现思路 ,网上搜相关资料几乎没有, 没有那就就自己想吧,就去看了下草料二维码;

然后突然就有感觉了 不就是把像素的颜色替换嘛 这还不简单

1 打开二维码图片

2 打开要填充的图片

3 将要填充的图片剪裁成和二维码一样大小

4 分析二维码的每个像素 替换成图片的像素就行了

以下是生成的例子:

例子

golang 生成个性二维码

golang 生成个性二维码

golang 生成个性二维码

golang 生成个性二维码

代码

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 知识

golang 生成个性二维码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Effective STL中文版

Effective STL中文版

[美] Scott Meyers / 潘爱民、陈铭、邹开红 / 电子工业出版社 / 2013-5 / 59.00元

《Effective STL中文版:50条有效使用STL的经验》是EffectiveC++的第3卷,被评为“值得所有C++程序员阅读的C++书籍之一”。《Effective STL中文版:50条有效使用STL的经验》详细讲述了使用STL的50条指导原则,并提供了透彻的分析和深刻的实例,实用性极强,是C++程序员必备的基础书籍。C++的标准模板库(STL)是革命性的,要用好STL并不容易。《Effe......一起来看看 《Effective STL中文版》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具