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)
	}
}

 

posted on 2021-12-29 17:33  studyphp  阅读(505)  评论(0编辑  收藏  举报

导航