Skip to content

Instantly share code, notes, and snippets.

@ajstarks
Created July 3, 2016 15:08
Show Gist options
  • Save ajstarks/3f5ba0511cc7839389bd29d4cdeebef1 to your computer and use it in GitHub Desktop.
Save ajstarks/3f5ba0511cc7839389bd29d4cdeebef1 to your computer and use it in GitHub Desktop.
// seam: resize images using seam carving
package main
import (
"flag"
"fmt"
"image"
"image/png"
"image/gif"
"image/jpeg"
"os"
"path"
"github.com/aaparella/carve"
)
func seam(filename string, size int) error {
r, err := os.Open(filename)
if err != nil {
return err
}
defer r.Close()
img, format, err := image.Decode(r)
if err != nil {
return err
}
resized, err := carve.ReduceHeight(img, size)
if err != nil {
return err
}
seamname := path.Join(path.Dir(filename), fmt.Sprintf("seam-%03d-%s", size, path.Base(filename)))
w, err := os.Create(seamname)
if err != nil {
return err
}
defer w.Close()
var werr error
switch format {
case "gif":
werr = gif.Encode(w, resized, nil)
case "png":
werr = png.Encode(w, resized)
case "jpeg":
werr = jpeg.Encode(w, resized, nil)
default:
werr = png.Encode(w, resized)
}
return werr
}
func main() {
var size = flag.Int("size", 50, "pixels to reduce")
flag.Parse()
for _, f := range flag.Args() {
if err := seam(f, *size); err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
continue
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment