diff --git a/main.go b/main.go index cac6522..ff7c731 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,9 @@ package main import ( "flag" "fmt" + "image/gif" "image/jpeg" + "image/png" "io/fs" "os" "path/filepath" @@ -18,6 +20,8 @@ type config struct { Quality uint Replace bool StartingPath string + PNG bool + GIF bool Quiet bool AtLeast uint MaxWidth uint @@ -40,6 +44,8 @@ func main() { flag.UintVar(&c.Diff, "diff", 25, "Percent difference required to replace original image.") flag.UintVar(&c.Quality, "quality", 85, "JPG compression quality level.") flag.BoolVar(&c.Quiet, "quiet", false, "Less output - don't print per-file detail") + flag.BoolVar(&c.PNG, "png", false, "Convert PNG files without transparency to JPG if the other criteria are met") + flag.BoolVar(&c.GIF, "gif", false, "Convert GIF files without transparency to JPG if the other criteria are met") flag.UintVar(&c.AtLeast, "atleast", 0, "Ignore images that aren't at least this many kilobytes") flag.BoolVar(&c.IgnoreSuffix, "ignoresuffix", false, "Ignore suffix on filenames and attempt to treat everything as a JPG") flag.UintVar(&c.MaxWidth, "maxwidth", 0, "Maximum width, scale images bigger to fit within this width. 0 ignores. Won't replace unless it meets the diff threashold.") @@ -77,7 +83,7 @@ func main() { for _, f := range d { if !f.IsDir() { ext := strings.ToLower(filepath.Ext(f.Name())) - if c.IgnoreSuffix || ext == ".jpg" || ext == ".jpeg" { + if c.IgnoreSuffix || ext == ".jpg" || ext == ".jpeg" || ext==".png" || ext==".gif" { filelist = append(filelist, f.Name()) } @@ -86,7 +92,7 @@ func main() { } else { filepath.WalkDir(c.StartingPath, func(path string, d fs.DirEntry, err error) error { ext := strings.ToLower(filepath.Ext(path)) - if !d.IsDir() && (c.IgnoreSuffix || ext == ".jpg" || ext == ".jpeg") { + if !d.IsDir() && (c.IgnoreSuffix || ext == ".jpg" || ext == ".jpeg" || ext==".png" || ext==".gif" ) { filelist = append(filelist, path) } return nil @@ -127,8 +133,14 @@ func doSingleImage(f string, c config, s stats) stats { defer in.Close() orig, err := jpeg.Decode(in) if err != nil { - fmt.Printf("Couldn't decode source image %s: %s\n", f, err.Error()) - return s + orig,err=png.Decode(in) + if err!=nil { + orig,err=gif.Decode(in) + if err != nil { + fmt.Printf("Couldn't decode source image %s: %s\n", f, err.Error()) + return s + } + } } in.Close() // Check bounds and resize if necessary