main.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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 len(flag.Args()) == 0 {
  35. flag.Usage()
  36. checkError(fmt.Errorf("Error: no content given"))
  37. }
  38. content := strings.Join(flag.Args(), " ")
  39. var err error
  40. var q *qrcode.QRCode
  41. q, err = qrcode.New(content, qrcode.Highest)
  42. checkError(err)
  43. if *textArt {
  44. art := qr2String(q, *negative)
  45. fmt.Println(art)
  46. return
  47. }
  48. if *negative {
  49. q.ForegroundColor, q.BackgroundColor = q.BackgroundColor, q.ForegroundColor
  50. }
  51. var png []byte
  52. png, err = q.PNG(*size)
  53. checkError(err)
  54. if *outFile == "" {
  55. os.Stdout.Write(png)
  56. } else {
  57. var fh *os.File
  58. fh, err = os.Create(*outFile + ".png")
  59. checkError(err)
  60. defer fh.Close()
  61. fh.Write(png)
  62. }
  63. }
  64. func checkError(err error) {
  65. if err != nil {
  66. fmt.Fprintf(os.Stderr, "%s\n", err)
  67. os.Exit(1)
  68. }
  69. }
  70. // qr2String produces a multi-line string that forms a QR-code image.
  71. func qr2String(qr *qrcode.QRCode, inverseColor bool) string {
  72. bits := qr.Bitmap()
  73. var buf bytes.Buffer
  74. for y := range bits {
  75. for x := range bits[y] {
  76. if bits[y][x] != inverseColor {
  77. buf.WriteString(" ")
  78. } else {
  79. buf.WriteString("██")
  80. }
  81. }
  82. buf.WriteString("\n")
  83. }
  84. return buf.String()
  85. }