Go有趣,5.20用Go作一個表白圖/讓文字跳舞

今天給你們介紹一個段有趣的代碼
將圖片生成用文字組成的圖案。看過B站那些文字組成的跳舞小姐姐的GIF嗎?用這段代碼你能夠本身作出來。linux

GIF我就懶得作了,做爲一個後端程序員,不是太有耐心一幀一幀截圖,你們能夠先看看把圖案文本貼在VScode裏的效果
img2txt程序員

直接上碼,說明都在代碼中shell

/*先定義一個函數
參數:
  imgPath: 圖片路徑
  size: 生成文本後的尺寸(這個不是真實的尺寸,1表明1個像素,1個像素會被替換成1個字符,因此是字符的個數,高度是自動換算的,因此這裏的size指的是「寬度」被壓縮成多少像素)
  txts: 將像素處理成的字符列表
  rowend: 換行字符(由於windows和linux不一樣)
  output: 生成文本文件保存路徑
*/
func img2txt(imgPath string, size uint, txts []string, rowend string, output string) {
  //獲取圖片文件 
  file, err := os.Open(imgPath)
  if err != nil {
    fmt.Println(err.Error())
    return
  }
  defer file.Close()
  
  //用圖片文件獲取圖片對象
  img, err := png.Decode(file)
  if err != nil {
    fmt.Println(err.Error())
    return
  }

  //用將寬度設置爲size,而後換算出等比例的高度
  var width = size
  var height = (size * uint(img.Bounds().Dy())) / (uint(img.Bounds().Dx()))
  height = height * 6 / 10 //這裏6/10是大體字符的寬高比
  newimg := resize.Resize(width, height, img, resize.Lanczos3)  //根據高寬resize圖片,並獲得新圖片的像素值
  dx := newimg.Bounds().Dx()
  dy := newimg.Bounds().Dy()

  //建立一個字節buffer,一會用來保存字符
  textBuffer := bytes.Buffer{}

  //遍歷圖片每一行每一列像素
  for y := 0; y < dy; y++ {
    for x := 0; x < dx; x++ {
      colorRgb := newimg.At(x, y)
      r, g, b, _ := colorRgb.RGBA()

      //得到三原色的值,算一個平均數出來
      avg := uint8((r + g + b) / 3 >> 8)
      //有多少個用來替換的字符就將256分爲多少個等分,而後計算這個像素的平均值趨緊與哪一個字符,最後,將這個字符添加到字符buffer裏
      num := avg / uint8(256/len(txts))
      textBuffer.WriteString(txts[num])
      fmt.Print(txts[num]) //打印出來
    }

    textBuffer.WriteString(rowend)  //一行結束,換行
    fmt.Print(rowend)
  }

  //將字符buffer的數據寫入到文本文件裏,結束。
  f, err := os.Create(output + ".txt")
  if err != nil {
    fmt.Println(err.Error())
    return
  }
  defer f.Close()

  f.WriteString(textBuffer.String())
}

而後,在main函數裏編程

func main() {
    img2txt("你的圖片.png", 200, []string{"@", "#", "*", "%", "+", ",", ".", " "}, "\n", "./保存的文本.txt")
}

搞定!!!windows

go run main.go

試試看,打開剛纔保存的文件看看效果後端

喜歡讓朋友驚訝的你,能夠用他們的照片作一個文本圖片啦、跳舞小姐姐的文字啦、代碼裏放有圖案的註釋啦....函數

猜猜她是誰?
image.png學習

喜歡的同窗能夠加個人公衆號,和你們一塊兒發現一塊兒學習編程的樂趣
曉代碼ui

相關文章
相關標籤/搜索