Go is fun, 5.20 make a diagram with go / let the words dance

Today, I'd like to introduce an interesting code
The picture is generated into a pattern of text. Have you seen the GIF of dancing sister composed of those words in station B? With this code you can do it yourself.

GIF, I'm too lazy to do it. As a back-end programmer, I'm not very patient with frame by frame screenshots. You can see the effect of pasting pattern text in VScode first

Code directly. The description is in the code

/*Define a function first
 Parameters:
  imgPath: Picture path
  size: The size after generating the text (this is not the real size, 1 represents 1 pixel, 1 pixel will be replaced by 1 character, so it is the number of characters, and the height is automatically converted, so the size here refers to how many pixels the "width" is compressed into)
  txts: List of characters to process pixels into
  rowend: Newline characters (because windows and linux are different)
  output: Generate text file save path
*/
func img2txt(imgPath string, size uint, txts []string, rowend string, output string) {
  //Get picture file 
  file, err := os.Open(imgPath)
  if err != nil {
    fmt.Println(err.Error())
    return
  }
  defer file.Close()
  
  //Get picture object with picture file
  img, err := png.Decode(file)
  if err != nil {
    fmt.Println(err.Error())
    return
  }

  //Use to set the width to size, and then convert to an equal proportion of the height
  var width = size
  var height = (size * uint(img.Bounds().Dy())) / (uint(img.Bounds().Dx()))
  height = height * 6 / 10 //Here 6 / 10 is the width to height ratio of approximate characters
  newimg := resize.Resize(width, height, img, resize.Lanczos3)  //resize the picture according to the height and width, and get the pixel value of the new picture
  dx := newimg.Bounds().Dx()
  dy := newimg.Bounds().Dy()

  //Create a byte buffer, which will be used to save characters later
  textBuffer := bytes.Buffer{}

  //Traversing pixels in each row and column of a picture
  for y := 0; y < dy; y++ {
    for x := 0; x < dx; x++ {
      colorRgb := newimg.At(x, y)
      r, g, b, _ := colorRgb.RGBA()

      //Get the value of three primary colors and calculate an average
      avg := uint8((r + g + b) / 3 >> 8)
      //As many characters as there are to replace, divide 256 into several equal parts, then calculate which character the average value of this pixel will be closer to, and finally, add this character to the character buffer
      num := avg / uint8(256/len(txts))
      textBuffer.WriteString(txts[num])
      fmt.Print(txts[num]) //Print out
    }

    textBuffer.WriteString(rowend)  //Line end, line break
    fmt.Print(rowend)
  }

  //Write the data of the character buffer to the text file. End.
  f, err := os.Create(output + ".txt")
  if err != nil {
    fmt.Println(err.Error())
    return
  }
  defer f.Close()

  f.WriteString(textBuffer.String())
}

Then, in the main function


func main() {
    img2txt("Your picture.png", 200, []string{"@", "#"," * ","% "," + ",", ".", ""}, "\ n", ". / saved text. txt")
}

Get it!!!

go run main.go

Try to open the file you just saved to see the effect

Like to surprise your friends, you can use their photos to make a text picture, dance little sister's text, code with a logo in the notes

Guess who she is?

My favorite classmates can add my public number and discover the fun of learning programming together.

Tags: Go Windows Linux Programming

Posted on Sun, 10 Nov 2019 11:26:31 -0500 by digitalecartoons