• Golang 通过Image包实现图片处理、二维码生成


    首先准备一个简单的图片 qrcode.png

    了解下几个处理图片的方法

    image.Decode() // 得到文件的图片对象
    image.NewRGBA() // 创建一个真彩色的图像对象 *RGBA
    func (p *RGBA) Bounds() Rectangle { return p.Rect } // 获取图片的尺寸
    func (p *RGBA) Set(x, y int, c color.Color) {} // 以像素点为单位为图像上色
    func Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op) {} // 图片拼接
    func Encode(w io.Writer, m image.Image) error {} // 输出图片文件
    

    案例一、将上面的图片绘制在以黑色为底的图片上:

    func TestImageSplice(t *testing.T) {
    	// 创建一个以黑色为底的图片
    	bgImg := image.NewRGBA(image.Rect(0, 0, 300, 300))
    	for x := 0; x < bgImg.Bounds().Dx(); x++ {    // 将背景图涂黑
    		for y := 0; y < bgImg.Bounds().Dy(); y++ {
    			bgImg.Set(x, y, color.Black)
    		}
    	}
    	// 拿到二维码图片对象
    	f, err := os.Open("./qrcode.png")
    	if err != nil {
    		panic(err)
    	}
    	qrcodeImg, _, err := image.Decode(f)
    	// 将二维码图片绘制到黑色的图片上
    	draw.Draw(bgImg, bgImg.Bounds(), qrcodeImg, image.Pt(0, 0), draw.Over)
    	fileOut, _ := os.Create("./image.png")
    	png.Encode(fileOut, bgImg)
    }
    

    需要导入resize包:

    go get github.com/nfnt/resize
    

    代码:

    func TestQrcodeLogoSlice(t *testing.T) {
       qrcodeFile, err := os.Open("./qrcode.png")
       if err != nil {
          panic(err)
       }
       qrcodeImg, _, err := image.Decode(qrcodeFile)
    
       logoFile, err := os.Open("./logo.png")
       if err != nil {
          panic(err)
       }
       logoImg, _, err := image.Decode(logoFile)
       logoImg = resize.Resize(uint(20), uint(20), logoImg, resize.Lanczos3)
    
       outQrcodeImg := image.NewRGBA(qrcodeImg.Bounds())
       draw.Draw(outQrcodeImg, qrcodeImg.Bounds(), qrcodeImg, image.Pt(0,0), draw.Over)
    
       offset := image.Pt((outQrcodeImg.Bounds().Max.X-logoImg.Bounds().Max.X)/2, (outQrcodeImg.Bounds().Max.Y-logoImg.Bounds().Max.Y)/2)
       draw.Draw(outQrcodeImg, qrcodeImg.Bounds().Add(offset), logoImg, image.Pt(0,0), draw.Over)
    
       fileOut, _ := os.Create("./image.png")
       png.Encode(fileOut, outQrcodeImg)
    }
    

    // 带logo的二维码图片生成
    func TestQrcodeWithLogoGenerate(t *testing.T) {
       content := "https://baidu.com"
       code, err := qrcode.New(content, qrcode.Medium)
       if err != nil {
          return
       }
       qrcodeImg := code.Image(256)
       outImg := image.NewRGBA(qrcodeImg.Bounds())
    
       logoFile, err := os.Open("./logo.png")
       if err != nil {
          panic(err)
       }
       logoImg, _, err := image.Decode(logoFile)
       logoImg = resize.Resize(uint(20), uint(20), logoImg, resize.Lanczos3)
    
       draw.Draw(outImg, outImg.Bounds(), qrcodeImg, image.Pt(0, 0), draw.Over)
       offset := image.Pt((outImg.Bounds().Max.X-logoImg.Bounds().Max.X)/2, (outImg.Bounds().Max.Y-logoImg.Bounds().Max.Y)/2)
       draw.Draw(outImg, outImg.Bounds().Add(offset), logoImg, image.Pt(0, 0), draw.Over)
    
       f, err := os.Create("image.png")
       if err != nil {
          return
       }
       png.Encode(f, outImg)
    }
    

    输出图片与案例二一样。

  • 相关阅读:
    RHadoop计算平台搭建
    基于Eclipse的scala应用开发
    2018-2019-1 20189219《Linux内核原理与分析》第六周作业
    2018-2019-1 20189219《Linux内核原理与分析》第五周作业
    2018-2019-1 20189219《Linux内核原理与分析》第四周作业
    myod实现
    2018-2019-1 20189219《Linux内核原理与分析》第三周作业
    2018-2019-1 20189219《Linux内核原理与分析》第二周作业
    学习实验楼《Linux入门基础》心得总结 &《Linux内核与分析》第一次作业
    memset函数浅析
  • 原文地址:https://www.cnblogs.com/GetcharZp/p/16000875.html
Copyright © 2020-2023  润新知