设为首页 收藏本站
查看: 1435|回复: 0

[经验分享] golang 六宫格、九宫格头像生成

[复制链接]

尚未签到

发表于 2018-9-21 06:47:39 | 显示全部楼层 |阅读模式
//Merge6Grid 6宫格  //rule NO1:至少3张图 最多6张图
  // NO2:第一张大小 60*60 其他大小 28*28 间隔4px 合成图大小102*102
  // NO3:排列顺序 从左至右 从上到小 再 从右到左
  // ++|
  // ++|
  // --|
  func Merge6Grid(src []io.Reader, dst io.Writer) error {
  defer func() {
  if r := recover(); r != nil {
  log.Println("Merge.recover:", r)
  }
  }()
  if len(src) < 3 || len(src) > 6 {
  panic("the pic num is between 3 and 6")
  }
  var err error
  imagePoints := getXy6Grid(len(src))
  //创建背景大图
  background := image.NewRGBA(image.Rect(0, 0, 100, 100))
  //设置背景为灰色
  for m := 0; m < 100; m++ {
  for n := 0; n < 100; n++ {
  //rgba := GetRGBA(0xC8CED4)
  background.SetRGBA(m, n, color.RGBA{127, 127, 127, 0})
  }
  }
  //背景图矩形圆角
  newBg, err := CreateRoundRectWithRGBA(background, 10)
  if err != nil {
  return err
  }
  //开始合成

  var>  for i, v := range imagePoints {
  x := v.x
  y := v.y
  if i == 0 {
  width = 60
  } else {
  width = 28
  }
  fOut := memory.NewWriter()
  //先缩略

  err = Scale(src, fOut,>  if err != nil {
  return err
  }
  //矩形圆角
  rgba, err := CreateRoundRectWithoutColor(fOut, 6)
  if err != nil {
  return err
  }
  draw.Draw(newBg, newBg.Bounds(), rgba, rgba.Bounds().Min.Sub(image.Pt(x, y)), draw.Src)
  }
  return png.Encode(dst, newBg)
  //return jpeg.Encode(dst, newBg, nil)
  }
  //CreateRoundRect 创建圆角矩形 r为输入图像 r为圆角半径 color为圆角颜色
  func CreateRoundRect(rd io.Reader, r int, c *color.RGBA) (*image.RGBA, error) {
  src, _, err := image.Decode(rd)
  if err != nil {
  return nil, err
  }
  b := src.Bounds()
  x := b.Dx()
  y := b.Dy()
  dst := image.NewRGBA(b)
  draw.Draw(dst, b, src, src.Bounds().Min, draw.Src)
  p1 := image.Point{r, r}
  p2 := image.Point{x - r, r}
  p3 := image.Point{r, y - r}
  p4 := image.Point{x - r, y - r}
  for m := 0; m < x; m++ {
  for n := 0; n < y; n++ {
  if (p1.X-m)*(p1.X-m)+(p1.Y-n)*(p1.Y-n) > r*r && m  p2.X && n  r*r && m  p3.Y {
  dst.Set(m, n, c)
  } else if (p4.X-m)*(p4.X-m)+(p4.Y-n)*(p4.Y-n) > r*r && m > p4.X && n > p4.Y {
  dst.Set(m, n, c)
  }
  }
  }
  return dst, nil
  }
  func CreateRoundRectWithoutColor(rd io.Reader, r int) (*image.RGBA, error) {
  src, _, err := image.Decode(rd)
  if err != nil {
  return nil, err
  }
  b := src.Bounds()
  x := b.Dx()
  y := b.Dy()
  dst := image.NewRGBA(b)
  p1 := image.Point{r, r}
  p2 := image.Point{x - r, r}
  p3 := image.Point{r, y - r}
  p4 := image.Point{x - r, y - r}
  for m := 0; m < x; m++ {
  for n := 0; n < y; n++ {
  if (p1.X-m)*(p1.X-m)+(p1.Y-n)*(p1.Y-n) > r*r && m  p2.X && n  r*r && m  p3.Y {
  } else if (p4.X-m)*(p4.X-m)+(p4.Y-n)*(p4.Y-n) > r*r && m > p4.X && n > p4.Y {
  } else {
  dst.Set(m, n, src.At(m, n))
  }
  }
  }
  return dst, nil
  }
  func CreateRoundRectWithRGBA(src *image.RGBA, r int) (*image.RGBA, error) {
  b := src.Bounds()
  x := b.Dx()
  y := b.Dy()
  dst := image.NewRGBA(b)
  p1 := image.Point{r, r}
  p2 := image.Point{x - r, r}
  p3 := image.Point{r, y - r}
  p4 := image.Point{x - r, y - r}
  for m := 0; m < x; m++ {
  for n := 0; n < y; n++ {
  if (p1.X-m)*(p1.X-m)+(p1.Y-n)*(p1.Y-n) > r*r && m  p2.X && n  r*r && m  p3.Y {
  } else if (p4.X-m)*(p4.X-m)+(p4.Y-n)*(p4.Y-n) > r*r && m > p4.X && n > p4.Y {
  } else {
  dst.Set(m, n, src.At(m, n))
  }
  }
  }
  return dst, nil
  }
  //0xC8CED4
  func GetRGBA(c int) *color.RGBA {
  var cl color.RGBA
  cl.R = uint8((c >> 16) & 0xFF)
  cl.G = uint8((c >> 8) & 0xFF)
  cl.B = uint8(c & 0xFF)
  return &cl
  }
  func getXy6Grid(size int) []*Point {

  s := make([]*Point,>  _x, _y := 4, 4
  s[0] = &Point{_x, _y}
  s[1] = &Point{60 + 2*_x, _y}
  s[2] = &Point{60 + 2*_x, 28 + 2*_y}

  if>  s[3] = &Point{60 + 2*_x, 28*2 + 3*_y}
  }

  if>  s[4] = &Point{28 + 2*_x, 60 + 2*_y}
  }

  if>  s[5] = &Point{_x, 60 + 2*_y}
  }
  return s
  }


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-599067-1-1.html 上篇帖子: [golang] Glide 包管理工具,在windows10 64位系统上的bug修复方案 下篇帖子: 八、golang文本操作、json协议
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表