func (imageUtils ImageUtils) Circle(){
file, err := os.Create("newcircle.png")
if err != nil {
fmt.Println(err)
}
defer file.Close()
imageFile , err := os.Open("background.png")
if err != nil {
fmt.Println(err)
}
defer imageFile.Close()
img, _ := png.Decode(imageFile)
pngImage := image.NewRGBA(image.Rect(0,0,0,0))
draw.Draw(pngImage,img.Bounds().Add(image.Pt(0,0)),img, img.Bounds().Min,draw.Src)
//draw.DrawMask(pngImage,img.Bounds().Add(image.Pt(0,0)),img,,image.Pt(20,20),draw.Src)
png.Encode(file,pngImage)
}
如何修改下 生成 原型图片呢
嗯,直接用Image 接口 是容易些,但是发现生成的图片是截取并非是对原有的图片进行自动的缩放来让整个图片都在圆中,但是按照circleMask 的方法生成的图片很诡异
![new_circle.png](https://static.studygolang.com/181113/c203e6569ae53bb4022a0fc6be38905d.png)
我生成的图片是这样的
```go
func (imageUtils ImageUtils) Circle(){
file, err := os.Create("new_circle.png")
if err != nil{
fmt.Println("创建图片失败 %v",err)
}
defer file.Close()
imageFile, err := os.Open("test.png")
if err != nil{
fmt.Println("打开需要处理的图片失败 %v",err)
}
defer imageFile.Close()
srcImg, _ := png.Decode(imageFile)
w := srcImg.Bounds().Max.X - srcImg.Bounds().Min.X
h := srcImg.Bounds().Max.Y - srcImg.Bounds().Min.Y
d := w
if w > h {
d = h
}
maskImg := circleMask(d)
dstImg := image.NewRGBA(image.Rect(0,0, d, d))
draw.DrawMask(dstImg, srcImg.Bounds().Add(image.Pt(0,0)), srcImg, image.Pt((w-d)/2,(h-d)/2), maskImg,image.Pt(0,0),draw.Src)
png.Encode(file, dstImg)
}
func circleMask(d int) image.Image{
img := image.NewRGBA(image.Rect(0,0,d,d))
for x:= 0;x<d ;x++{
for y:= 0 ;y<d ; y++{
dis := math.Sqrt(math.Pow(float64(x-d/2),2))+ math.Pow(float64(y-d/2),2)
if dis > float64(d)/2{
img.Set(x,y,color.RGBA{255,255,255,0})
}else{
img.Set(x,y,color.RGBA{0,0,255,255})
}
}
}
return img
}
```
#7
更多评论
简单实现了下
``` go
func Circle() {
file, err := os.Create("newcircle.png")
if err != nil {
fmt.Println(err)
}
defer file.Close()
imageFile , err := os.Open("background.png")
if err != nil {
fmt.Println(err)
}
defer imageFile.Close()
srcImg, _ := png.Decode(imageFile)
w := srcImg.Bounds().Max.X - srcImg.Bounds().Min.X
h := srcImg.Bounds().Max.Y - srcImg.Bounds().Min.Y
d := w
if w > h {
d = h
}
maskImg := circleMask(d)
dstImg := image.NewRGBA(image.Rect(0,0,d,d))
draw.DrawMask(dstImg, srcImg.Bounds().Add(image.Pt(0,0)), srcImg, image.Pt((w-d)/2,(h-d)/2), maskImg,image.Pt(0,0),draw.Src)
png.Encode(file, dstImg)
}
func circleMask(d int) image.Image{
img := image.NewRGBA(image.Rect(0,0,d,d))
for x:= 0;x<d;x++{
for y:= 0;y<d;y++{
dis := math.Sqrt(math.Pow(float64(x-d/2),2)+math.Pow(float64(y-d/2),2))
if dis > float64(d)/2 {
img.Set(x,y,color.RGBA{255, 255, 255, 0})
}else {
img.Set(x,y,color.RGBA{0, 0, 255, 255})
}
}
}
return img
}
```
效果如下,不知道是不是你想要的效果
背景图:
![background.png](https://static.studygolang.com/181111/a05ecb880207fbebdbf8c37ba109848f.png)
圆形图:
![newcircle.png](https://static.studygolang.com/181111/36c1f1118a3eee6033b1bf774e4fa026.png)
#1
对的,非常感谢,就是我想要的效果,这个是非常实用的,尤其在小程序生成分享图片的时候很多需求会涉及到原型的头像,我以前都是用PHP 去生成,中间包括文字 头像 图片的合成布局,一旦访问量大了,PHP 直接就干的CPU 爆满,最近就一直在思索用GO是尝试重写图片生成这块 做成一个分布式的生成服务
#2