zoukankan      html  css  js  c++  java
  • golang image库的使用

    golang 是有image库的。用起来很方便也很简单。

    介绍:https://www.jianshu.com/p/82dfa1ebe11b

    本文直接贴代码

    1、读取图片

    package main
    
    import (
    	"fmt"
    	"image"
    	"os"
    )
    
    func ReadPng() {
    	f, err := os.Open("/Users/xxx/Downloads/xxx.png")
    	if err != nil {
    		fmt.Println(err)
    	}
    	img, formatName, err := image.Decode(f)
    	if err != nil {
    		fmt.Println(err)
    	}
    
    	fmt.Println(formatName)
    	fmt.Println(img.Bounds())
    	fmt.Println(img.ColorModel())
    }
    

      

    2、创建png图

    package main
    
    import (
    	"bufio"
    	"fmt"
    	"image"
    	"image/png"
    	"os"
    )
    
    func NewPng() {
    	//新建图片
    	img := image.NewRGBA(image.Rect(0, 0, 300, 300))
    	outFile, err := os.Create("/Users/xxx/Downloads/test1.png")
    	defer outFile.Close()
    	if err != nil {
    		fmt.Println(err)
    	}
    	b := bufio.NewWriter(outFile)
    	err = png.Encode(b, img)
    	if err != nil {
    		fmt.Println(err)
    	}
    	err = b.Flush()
    	if err != nil {
    		fmt.Println(err)
    	}
    }

    3、绘制图

    package main
    
    import (
    	"bufio"
    	"fmt"
    	"image"
    	"image/color"
    	"image/draw"
    	"image/png"
    	"os"
    )
    
    func Draw() {
    	f, err := os.Open("/Users/xxx/Downloads/xxx.png")
    	if err != nil {
    		panic(err)
    	}
    	srcImg, _, err := image.Decode(f) // 打开图片
    	img := image.NewRGBA(image.Rect(0, 0, 300, 300))
    	for x := 0; x < img.Bounds().Dx(); x++ { // 将背景图涂黑
    		for y := 0; y < img.Bounds().Dy(); y++ {
    			img.Set(x, y, color.Black)
    		}
    	}
    	draw.Draw(img, img.Bounds(), srcImg, image.Pt(0, 0), draw.Over) // 将srcImg绘制到背景图上
    
    	outFile, err := os.Create("/Users/xxx/Downloads/test2.png")
    	defer outFile.Close()
    	if err != nil {
    		fmt.Println(err)
    	}
    	b := bufio.NewWriter(outFile)
    	err = png.Encode(b, img)
    	if err != nil {
    		fmt.Println(err)
    	}
    	err = b.Flush()
    	if err != nil {
    		fmt.Println(err)
    	}
    }
    

      

    4、图片遮罩处理

    package main
    
    import (
    	"bufio"
    	"fmt"
    	"image"
    	"image/color"
    	"image/draw"
    	"image/png"
    	"os"
    )
    
    type circle struct { // 这里需要自己实现一个圆形遮罩,实现接口里的三个方法
    	p image.Point // 圆心位置
    	r int
    }
    
    func (c *circle) ColorModel() color.Model {
    	return color.AlphaModel
    }
    
    func (c *circle) Bounds() image.Rectangle {
    	return image.Rect(c.p.X-c.r, c.p.Y-c.r, c.p.X+c.r, c.p.Y+c.r)
    }
    
    // 对每个像素点进行色值设置,在半径以内的图案设成完全不透明
    func (c *circle) At(x, y int) color.Color {
    	xx, yy, rr := float64(x-c.p.X)+0.5, float64(y-c.p.Y)+0.5, float64(c.r)
    	if xx*xx+yy*yy < rr*rr {
    		return color.Alpha{A: 255}
    	}
    	return color.Alpha{}
    }
    
    func DrawCirclePic() {
    	f, err := os.Open("/Users/xxx/Downloads/xxx.png")
    	if err != nil {
    		panic(err)
    	}
    	srcImg, _, err := image.Decode(f)
    	d := srcImg.Bounds().Dx()
    
    	//将一个circle作为蒙层遮罩,圆心为图案中点,半径为边长的一半
    	c := circle{
    		p: image.Point{X:d/2,Y:d/2},
    		r: d/2,
    	}
    	circleImg := image.NewRGBA(image.Rect(0,0,d,d))
    	draw.DrawMask(circleImg, circleImg.Bounds(), srcImg, image.Point{}, &c, image.Point{}, draw.Over)
    	outFile, err := os.Create("/Users/xxx/Downloads/test3.png")
    	defer outFile.Close()
    	if err != nil {
    		fmt.Println(err)
    	}
    	b := bufio.NewWriter(outFile)
    	err = png.Encode(b, circleImg)
    	if err != nil {
    		fmt.Println(err)
    	}
    	err = b.Flush()
    	if err != nil {
    		fmt.Println(err)
    	}
    }
    

      

    5、将一张图上画数字

    package main
    
    import (
    	"bufio"
    	"fmt"
    	"github.com/golang/freetype"
    	"image"
    	"image/color"
    	"image/draw"
    	"image/png"
    	"io/ioutil"
    	"log"
    	"os"
    )
    
    func DrawNumberPic() {
    	bgImg, err := os.Open("/Users/xxx/Downloads/nv.png")
    	if err != nil {
    		panic(err)
    	}
    	srcImg, _, err := image.Decode(bgImg) // 打开图片
    
    	numberImgW := 30
    	numberImgH := 30
    	numberImg := image.NewRGBA(image.Rect(0, 0, numberImgW, numberImgH))
    	//为背景图片设置颜色
    	for y := 0; y < numberImgW; y++ {
    		for x := 0; x < numberImgH; x++ {
    			numberImg.Set(x, y, color.RGBA{255, 255, 255, 255})
    		}
    	}
    
    	//读取字体数据  http://fonts.mobanwang.com/201503/12436.html
    	fontBytes, err := ioutil.ReadFile("/Users/xxx/Downloads/Go-Bold-Italic.ttf")
    	if err != nil {
    		log.Println(err)
    	}
    	//载入字体数据
    	font, err := freetype.ParseFont(fontBytes)
    	if err != nil {
    		log.Println("载入字体失败", err)
    	}
    	f := freetype.NewContext()
    	//设置分辨率
    	f.SetDPI(100)
    	//设置字体
    	f.SetFont(font)
    	//设置尺寸
    	f.SetFontSize(24)
    	f.SetClip(numberImg.Bounds())
    	//设置输出的图片
    	f.SetDst(numberImg)
    	//设置字体颜色(红色)
    	f.SetSrc(image.NewUniform(color.RGBA{255, 0, 0, 255}))
    	//设置字体的位置
    	pt := freetype.Pt(10, 30)
    	_, err = f.DrawString("8", pt)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    
    	img := image.NewRGBA(image.Rect(0, 0, 1386, 602))
    	draw.Draw(img, img.Bounds(), srcImg, image.Pt(0, 0), draw.Over) // 将背景绘制到背景图上
    	draw.Draw(img, img.Bounds(), numberImg, image.Pt(-350, -210), draw.Over)
    
    	outFile, err := os.Create("/Users/xxx/Downloads/test4.png")
    	defer outFile.Close()
    	if err != nil {
    		fmt.Println(err)
    	}
    	b := bufio.NewWriter(outFile)
    	err = png.Encode(b, img)
    	if err != nil {
    		fmt.Println(err)
    	}
    	err = b.Flush()
    	if err != nil {
    		fmt.Println(err)
    	}
    }
    
    func DrawNumber() {
    	//图片的宽度
    	srcWidth := 10
    	//图片的高度
    	srcHeight := 10
    	imgfile, _ := os.Create("number.png")
    	defer imgfile.Close()
    
    	img := image.NewRGBA(image.Rect(0, 0, srcWidth, srcHeight))
    
    	//为背景图片设置颜色
    	for y := 0; y < srcWidth; y++ {
    		for x := 0; x < srcHeight; x++ {
    			img.Set(x, y, color.RGBA{255, 255, 255, 255})
    		}
    	}
    
    	//读取字体数据  http://fonts.mobanwang.com/201503/12436.html
    	fontBytes, err := ioutil.ReadFile("/Users/xxx/Downloads/Go-Bold-Italic.ttf")
    	if err != nil {
    		log.Println(err)
    	}
    	//载入字体数据
    	font, err := freetype.ParseFont(fontBytes)
    	if err != nil {
    		log.Println("载入字体失败", err)
    	}
    	f := freetype.NewContext()
    	//设置分辨率
    	f.SetDPI(100)
    	//设置字体
    	f.SetFont(font)
    	//设置尺寸
    	f.SetFontSize(10)
    	f.SetClip(img.Bounds())
    	//设置输出的图片
    	f.SetDst(img)
    	//设置字体颜色(红色)
    	f.SetSrc(image.NewUniform(color.RGBA{255, 0, 0, 255}))
    
    	//设置字体的位置
    	pt := freetype.Pt(5, 5)
    
    	_, err = f.DrawString("8", pt)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	//以png 格式写入文件
    	err = png.Encode(imgfile, img)
    	if err != nil {
    		log.Fatal(err)
    	}
    }

  • 相关阅读:
    再谈Dilworth定理
    区间动态规划
    单调队列优化动态规划
    暑假集训考试R2 konomi 慕
    NOIP 2000 计算器的改良
    2007 Simulation message
    COCI 2003 LIFTOVI 电梯 SPFA
    NOIP 2003 数字游戏
    USACO 2014 DEC Guard Mark 状态压缩
    使用HttpClient发送GET请求
  • 原文地址:https://www.cnblogs.com/already/p/15745900.html
Copyright © 2011-2022 走看看