main.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // go-qrcode
  2. // Copyright 2014 Tom Harwood
  3. package main
  4. import (
  5. "bytes"
  6. "flag"
  7. "fmt"
  8. "os"
  9. "strings"
  10. qrcode "github.com/skip2/go-qrcode"
  11. )
  12. func main() {
  13. outFile := flag.String("o", "", "out PNG file prefix, empty for stdout")
  14. size := flag.Int("s", 256, "image size (pixel)")
  15. textArt := flag.Bool("t", false, "print as text-art on stdout")
  16. negative := flag.Bool("i", false, "invert black and white")
  17. flag.Usage = func() {
  18. fmt.Fprintf(os.Stderr, `qrcode -- QR Code encoder in Go
  19. https://github.com/skip2/go-qrcode
  20. Flags:
  21. `)
  22. flag.PrintDefaults()
  23. fmt.Fprintf(os.Stderr, `
  24. Usage:
  25. 1. Arguments except for flags are joined by " " and used to generate QR code.
  26. Default output is STDOUT, pipe to imagemagick command "display" to display
  27. on any X server.
  28. qrcode hello word | display
  29. 2. Save to file if "display" not available:
  30. qrcode "homepage: https://github.com/skip2/go-qrcode" > out.png
  31. `)
  32. }
  33. flag.Parse()
  34. if *size <= 0 {
  35. checkError(fmt.Errorf("Error: value of -s should > 0"))
  36. }
  37. if len(flag.Args()) == 0 {
  38. flag.Usage()
  39. checkError(fmt.Errorf("Error: no content given"))
  40. }
  41. content := strings.Join(flag.Args(), " ")
  42. var err error
  43. var q *qrcode.QRCode
  44. q, err = qrcode.New(content, qrcode.Highest)
  45. checkError(err)
  46. if *textArt {
  47. art := qr2String(q, *negative)
  48. fmt.Println(art)
  49. return
  50. }
  51. if *negative {
  52. q.ForegroundColor, q.BackgroundColor = q.BackgroundColor, q.ForegroundColor
  53. }
  54. var png []byte
  55. png, err = q.PNG(*size)
  56. checkError(err)
  57. if *outFile == "" {
  58. os.Stdout.Write(png)
  59. } else {
  60. var fh *os.File
  61. fh, err = os.Create(*outFile + ".png")
  62. checkError(err)
  63. defer fh.Close()
  64. fh.Write(png)
  65. }
  66. }
  67. func checkError(err error) {
  68. if err != nil {
  69. fmt.Fprintf(os.Stderr, "%s\n", err)
  70. os.Exit(1)
  71. }
  72. }
  73. // qr2String produces a multi-line string that forms a QR-code image.
  74. func qr2String(qr *qrcode.QRCode, inverseColor bool) string {
  75. bits := qr.Bitmap()
  76. var buf bytes.Buffer
  77. for y := range bits {
  78. for x := range bits[y] {
  79. if bits[y][x] != inverseColor {
  80. buf.WriteString(" ")
  81. } else {
  82. buf.WriteString("██")
  83. }
  84. }
  85. buf.WriteString("\n")
  86. }
  87. return buf.String()
  88. }