Golang实现文字转字符画

前端之家收集整理的这篇文章主要介绍了Golang实现文字转字符画前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Golang实现文字转字符画

简单说下原理:使用文字创建位图,然后根据位图计算每个像素点的灰度,根据灰度使用不同的字符将所有像素拼接即可.
1.相关使用的包

import (

      "github.com/golang/freetype"
      "fmt"
      "image"
      "strconv"
      //"image/color"
      "image/png"
      "io/IoUtil"
      "log"
      "os"

  )

2.根据文字创建图像

func createImage(textName string) {

      imgfile,_ := os.Create(textName+".png")
      defer imgfile.Close()
      //创建位图,坐标x,y,长宽x,y
      img := image.NewNRGBA(image.Rect(0,0,100,40))
      /* // 画背景,这里可根据喜好画出背景颜色 for y := 0; y < dy; y++ { for x := 0; x < dx; x++ { //设置某个点的颜色,依次是 RGBA img.Set(x,y,color.RGBA{uint8(x),uint8(y),255}) } } */
      //读字体数据
      fontBytes,err := IoUtil.ReadFile("consola.TTF")
      if err != nil {
          log.Println(err)
          return
      }

      font,err := freetype.ParseFont(fontBytes)
      if err != nil {
          log.Println(err)
          return
      }

      c := freetype.NewContext()
      c.SetDPI(72)
      c.SetFont(font)
      c.SetFontSize(40)
      c.SetClip(img.Bounds())
      c.SetDst(img)
      c.SetSrc(image.White)
      //设置字体显示位置
      pt := freetype.Pt(5,20+int(c.PointToFixed(40)>>8))
      _,err = c.DrawString(textName,pt)
      if err != nil {
          log.Println(err)
          return
      }
      //保存图像到文件
      err = png.Encode(imgfile,img)
      if err != nil {
          log.Fatal(err)
      }

  }

3.根据图像输出字符画

func drawAscii(){
    //灰度替换字符
       base := "@#&$%*o!;."
       file1,_ := os.Open("TASS.png") //图像名称
       image1,_ := png.Decode(file1)
       bounds:=image1.Bounds()//获取图像的边界信息
       logo:=""//存储最终的字符画string
       for y:=0;y<bounds.Dy();y+=2{
           for x:=0;x<bounds.Dx();x++{
               pixel:=image1.At(x,y)//获取像素点
               r,g,b,_ := pixel.RGBA()//获取像素点的rgb
               r=r&0xFF
               g=g&0xFF
               b=b&0xFF
               //灰度计算
               gray := 0.299 * float64(r) + 0.578 * float64(g) + 0.114 * float64(b)
               temp:=fmt.Sprintf("%.0f",gray*float64(len(base)+1)/255)
               index,_:=strconv.Atoi(temp)
               //根据灰度索引字符并保存
               if index>=len(base) {
                    logo+=" "
               }else{
                    logo+=string(base[index])
               }

           }
           logo+="\r\n"
       }
       file1.Close()
       //输出字符画
       log.Printf("\033[31;1m%s,%d",logo,len(logo))
   }

4.效果

原文链接:https://www.f2er.com/go/188610.html

猜你在找的Go相关文章