parent
f19caf9b96
commit
1da175b879
@ -0,0 +1,39 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"os" |
||||||
|
"encoding/json" |
||||||
|
"log" |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
type Conversion struct { |
||||||
|
PixelWidth int |
||||||
|
ColorDepth int |
||||||
|
DitherType int |
||||||
|
Width int |
||||||
|
Height int |
||||||
|
} |
||||||
|
|
||||||
|
type Settings struct { |
||||||
|
Source string |
||||||
|
Target string |
||||||
|
Base Conversion |
||||||
|
Exceptions map[string]Conversion |
||||||
|
} |
||||||
|
|
||||||
|
func LoadSettings(path string) Settings { |
||||||
|
var settings Settings |
||||||
|
|
||||||
|
config, err := os.ReadFile(path) |
||||||
|
if err != nil { |
||||||
|
log.Fatalf("invalid config path: %s", path) |
||||||
|
} |
||||||
|
|
||||||
|
err = json.Unmarshal(config, &settings) |
||||||
|
if err != nil { |
||||||
|
log.Fatalf("json format error:", err) |
||||||
|
} |
||||||
|
|
||||||
|
return settings |
||||||
|
} |
||||||
@ -0,0 +1,50 @@ |
|||||||
|
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) |
||||||
|
} |
||||||
Loading…
Reference in new issue