commit 58775bf6d49072902d9b171fe4e88332af50a22c Author: Pavle Portic Date: Sat Apr 13 00:30:22 2019 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..37aab56 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.jpg +*.png +lumetri diff --git a/main.go b/main.go new file mode 100644 index 0000000..f4ec1e2 --- /dev/null +++ b/main.go @@ -0,0 +1,108 @@ +// +// main.go +// Copyright (C) 2019 pavle +// +// Distributed under terms of the BSD-3-Clause license. +// + +package main + +import ( + "fmt" + "image" + "image/color" + _ "image/jpeg" + "image/png" + "log" + // "math" + "os" + "time" +) + +func elapsed() func() { + start := time.Now() + return func() { + fmt.Printf("%v\n", time.Since(start)) + } +} + +const width uint = 512 + +func main() { + defer elapsed()() + + imgfile, err := os.Open("in.jpg") + if err != nil { + log.Fatal(err) + } + defer imgfile.Close() + + img, _, err := image.Decode(imgfile) + if err != nil { + log.Fatal(err) + } + + bounds := img.Bounds() + scale := float64(width) / float64(bounds.Max.X - bounds.Min.X) + coeff := uint8(scale * 4) + if coeff == 0 { + coeff = 1 + } + fmt.Printf("scale: %v, coeff: %v\n", scale, coeff) + + scope := image.NewRGBA(image.Rect(0, 0, int(width), 256)) + scope_bounds := scope.Bounds() + + for y := scope_bounds.Min.Y; y < scope_bounds.Max.Y; y++ { + for x := scope_bounds.Min.X; x < scope_bounds.Max.X; x++ { + scope.SetRGBA(x, y, color.RGBA{0, 0, 0, 255}) + } + } + + for y := bounds.Min.Y; y < bounds.Max.Y; y++ { + for x := bounds.Min.X; x < bounds.Max.X; x++ { + r, g, b, _:= img.At(x, y).RGBA() + ir := uint8(r >> 8) + ig := uint8(g >> 8) + ib := uint8(b >> 8) + + tr, tg, tb, _ := scope.At(int(float64(x) * scale), 255 - int(ir)).RGBA() + sr := uint8(tr >> 8) + sg := uint8(tg >> 8) + sb := uint8(tb >> 8) + if sr > 255 - coeff { + sr = 255 + } else { + sr += coeff + } + scope.SetRGBA(int(float64(x) * scale), 255 - int(ir), color.RGBA{sr, sg, sb, 255}) + + tr, tg, tb, _ = scope.At(int(float64(x) * scale), 255 - int(ig)).RGBA() + sr = uint8(tr >> 8) + sg = uint8(tg >> 8) + sb = uint8(tb >> 8) + if sg > 255 - coeff { + sg = 255 + } else { + sg += coeff + } + scope.SetRGBA(int(float64(x) * scale), 255 - int(ig), color.RGBA{sr, sg, sb, 255}) + + tr, tg, tb, _ = scope.At(int(float64(x) * scale), 255 - int(ib)).RGBA() + sr = uint8(tr >> 8) + sg = uint8(tg >> 8) + sb = uint8(tb >> 8) + if sb > 255 - coeff { + sb = 255 + } else { + sb += coeff + } + scope.SetRGBA(int(float64(x) * scale), 255 - int(ib), color.RGBA{sr, sg, sb, 255}) + } + } + + outFile, _ := os.Create("output.png") + defer outFile.Close() + png.Encode(outFile, scope) +} +