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

浙公网安备 33010602011771号