| // Copyright 2026 The Wuffs Authors. | |
| // | |
| // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
| // https://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
| // <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your | |
| // option. This file may not be copied, modified, or distributed | |
| // except according to those terms. | |
| // | |
| // SPDX-License-Identifier: Apache-2.0 OR MIT | |
| //go:build ignore | |
| // +build ignore | |
| package main | |
| // handsum-tilify.go decodes JPEG or PNG from stdin, partitions it into a grid | |
| // of 16×16 tiles, round-trips each tile through the Handsum codec and writes | |
| // the resultant PNG to stdout. | |
| // | |
| // Usage: go run handsum-tilify.go < input.png > output.png | |
| import ( | |
| "bytes" | |
| "flag" | |
| "image" | |
| "image/draw" | |
| "image/png" | |
| "os" | |
| "github.com/google/wuffs/lib/handsum" | |
| _ "image/jpeg" | |
| ) | |
| var qFlag = flag.Int("q", 4, "Encoding quality: 1, 2, 3 or 4 (default)") | |
| func main() { | |
| if err := main1(); err != nil { | |
| os.Stderr.WriteString(err.Error() + "\n") | |
| os.Exit(1) | |
| } | |
| } | |
| func main1() error { | |
| flag.Parse() | |
| quality := handsum.Quality(max(1, min(4, *qFlag))) | |
| src0, _, err := image.Decode(os.Stdin) | |
| if err != nil { | |
| return err | |
| } | |
| bounds := src0.Bounds() | |
| src1, _ := src0.(interface { | |
| SubImage(image.Rectangle) image.Image | |
| }) | |
| dst := image.NewRGBA(bounds) | |
| buf := &bytes.Buffer{} | |
| for y := bounds.Min.Y; y < bounds.Max.Y; y += 16 { | |
| for x := bounds.Min.X; x < bounds.Max.X; x += 16 { | |
| buf.Reset() | |
| rect := image.Rect(x, y, x+16, y+16) | |
| tile := src1.SubImage(rect) | |
| handsum.Encode(buf, tile, &handsum.EncodeOptions{ | |
| Quality: quality, | |
| }) | |
| roundTripped, _ := handsum.Decode(buf) | |
| draw.Draw(dst, rect, roundTripped, roundTripped.Bounds().Min, draw.Src) | |
| } | |
| } | |
| return png.Encode(os.Stdout, dst) | |
| } |