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