package main import ( "os" "image" "log" "image/png" "github.com/disintegration/gift" "lcthw.dev/go/jankifier/filters" ) func LoadImage(filename string) image.Image { reader, err := os.Open(filename) if err != nil { log.Fatal(err) } defer reader.Close() img, _, err := image.Decode(reader) if err != nil { log.Fatal(err) } return img } func SaveImage(filename string, img image.Image) { out, err := os.Create(filename) if err != nil { log.Fatalf("can't write file %s: %v", filename, err) } defer out.Close() err = png.Encode(out, img) if err != nil { log.Fatalf("can't png encode %s: %v", filename, err) } } func JankImage(settings Conversion, in_file string, out_file string) { src := LoadImage(in_file) bounds := src.Bounds() resize := gift.Resize(bounds.Max.X / settings.PixelWidth, 0, gift.NearestNeighborResampling) posterize := filters.Posterize(uint16(settings.ColorDepth), settings.DitherType) upscale := filters.Upscale(bounds, settings.PixelWidth) sharpen := gift.UnsharpMask(1, 1, 0) g := gift.New(resize, posterize, upscale, sharpen) out_img := image.NewNRGBA(g.Bounds(bounds)) g.Draw(out_img, src) SaveImage(out_file, out_img) }