diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2025-03-17 20:53:05 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2025-03-17 20:53:05 -0700 |
| commit | bb4969e67a8907f57ae16ffa4f94cbc98d5408d3 (patch) | |
| tree | d19ef17e0cc41bab1bbaf255044e1113f0b1ce7a /convert.go | |
| download | imgutil-bb4969e67a8907f57ae16ffa4f94cbc98d5408d3.tar.zst | |
Initial commit
Diffstat (limited to 'convert.go')
| -rw-r--r-- | convert.go | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/convert.go b/convert.go new file mode 100644 index 0000000..ea7403c --- /dev/null +++ b/convert.go @@ -0,0 +1,101 @@ +package main + +import ( + "errors" + "flag" + "fmt" + "image" + "image/gif" + "image/jpeg" + "image/png" + "os" + "strings" + + "golang.org/x/image/bmp" + "golang.org/x/image/tiff" + _ "golang.org/x/image/webp" +) + +func load(filename string) (image.Image, error) { + file := os.Stdin + if filename != "-" { + var err error + file, err = os.Open(filename) + if err != nil { + return nil, err + } + defer file.Close() + } + + img, _, err := image.Decode(file) + if err != nil { + return nil, fmt.Errorf("decode %q: %s", filename, err) + } + + return img, nil +} + +func run() error { + args := flag.Args() + if len(args) != 2 { + return errors.New("usage: convert input-file output-file") + } + inputFileName, outputFileName := args[0], args[1] + + n := strings.LastIndex(outputFileName, ".") + if n < 0 { + return errors.New("unknown output file extension") + } + ext := outputFileName[n+1:] + switch ext { + case "gif", "jpeg", "jpg", "png", "bmp", "tiff": + default: + return fmt.Errorf("unknown output file extension %q", ext) + } + + input, err := load(inputFileName) + if err != nil { + return err + } + + outputFile, err := os.Create(outputFileName) + if err != nil { + return err + } + defer outputFile.Close() + switch ext { + case "gif": + err = gif.Encode(outputFile, input, nil) + case "jpeg", "jpg": + err = jpeg.Encode(outputFile, input, nil) + case "png": + err = png.Encode(outputFile, input) + case "bmp": + err = bmp.Encode(outputFile, input) + case "tiff": + err = tiff.Encode(outputFile, input, nil) + } + if err != nil { + return err + } + return outputFile.Close() +} + +func main() { + flag.Usage = func() { + fmt.Fprint(os.Stderr, `Usage: convert input-file output-file +Supported formats: + png + jpeg + bmp + tiff + webp (input only) +`) + } + flag.Parse() + + if err := run(); err != nil { + fmt.Fprintf(os.Stderr, "convert: %s\n", err) + os.Exit(1) + } +} |
