From 53efae2ad92a96b081b38ec1c0afb4e7610fff8a Mon Sep 17 00:00:00 2001 From: Ivan Danyliuk Date: Sun, 11 Nov 2018 18:55:30 +0100 Subject: [PATCH] Add txqr-gif command --- cmd/txqr-gif/.gitignore | 1 + cmd/txqr-gif/main.go | 65 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 cmd/txqr-gif/.gitignore create mode 100644 cmd/txqr-gif/main.go diff --git a/cmd/txqr-gif/.gitignore b/cmd/txqr-gif/.gitignore new file mode 100644 index 0000000..d8c9f4f --- /dev/null +++ b/cmd/txqr-gif/.gitignore @@ -0,0 +1 @@ +txqr-ascii diff --git a/cmd/txqr-gif/main.go b/cmd/txqr-gif/main.go new file mode 100644 index 0000000..db0698a --- /dev/null +++ b/cmd/txqr-gif/main.go @@ -0,0 +1,65 @@ +package main + +import ( + "encoding/base64" + "flag" + "image" + "image/gif" + "io/ioutil" + "log" + "os" + "time" + + "github.com/divan/txqr/protocol" + "github.com/divan/txqr/qr" +) + +func main() { + splitSize := flag.Int("split", 100, "Chunk size for data split per frame") + size := flag.Int("size", 300, "QR code size") + delay := flag.Duration("delay", 100*time.Millisecond, "Delay between frames") + output := flag.String("o", "out.gif", "Output animated gif file") + flag.Parse() + + if len(flag.Args()) != 1 { + log.Fatalf("Usage: %s file", os.Args[0]) + } + + filename := flag.Args()[0] + + data, err := ioutil.ReadFile(filename) + if err != nil { + log.Fatalf("Read input file failed: %v", err) + } + + str := base64.StdEncoding.EncodeToString(data) + log.Println("Base64 encoded size:", len(str), "bytes") + chunks, err := protocol.NewEncoder(*splitSize).Encode(str) + if err != nil { + log.Fatalf("Encode failed: %v", err) + } + + out := &gif.GIF{ + Image: make([]*image.Paletted, len(chunks)), + Delay: make([]int, len(chunks)), + } + for i, chunk := range chunks { + qr, err := qr.Encode(chunk, *size) + if err != nil { + log.Fatalf("[ERROR] QR: %v", err) + } + out.Image[i] = qr.(*image.Paletted) + out.Delay[i] = int(*delay / (10 * time.Millisecond)) // yeah, delays are in 100th of a second + } + + fd, err := os.Create(*output) + if err != nil { + log.Fatalf("[ERROR] Create file: %v", err) + } + err = gif.EncodeAll(fd, out) + if err != nil { + log.Fatalf("[ERROR] Generate gif: %v", err) + } + log.Printf("Saved %d frames into %s\n", len(chunks), *output) + +}