From 02b785a4df263583136cb2016dfd6d75dd6f58c2 Mon Sep 17 00:00:00 2001 From: Laurent Le Goff Date: Thu, 14 Apr 2011 15:42:13 +0200 Subject: [PATCH] enhance bilinear algo --- cmd/testimage.go | 3 +- draw2d/rgba_interpolation.go | 283 +++++++++++++++--------------- resource/result/TestDrawImage.png | Bin 23523 -> 23508 bytes 3 files changed, 146 insertions(+), 140 deletions(-) diff --git a/cmd/testimage.go b/cmd/testimage.go index 107eeed..4bd5a84 100644 --- a/cmd/testimage.go +++ b/cmd/testimage.go @@ -60,8 +60,9 @@ func main() { tr := draw2d.NewIdentityMatrix() tr.Translate(width/2, height/2) tr.Rotate(30 * math.Pi / 180) + //tr.Scale(3, 3) tr.Translate(-width/2, -height/2) - tr.Translate(75, 25) + tr.Translate(200, 5) lastTime := time.Nanoseconds() draw2d.DrawImage(source, dest, tr, draw.Over, draw2d.BilinearFilter) dt := time.Nanoseconds() - lastTime diff --git a/draw2d/rgba_interpolation.go b/draw2d/rgba_interpolation.go index 892a9d9..29056b1 100644 --- a/draw2d/rgba_interpolation.go +++ b/draw2d/rgba_interpolation.go @@ -1,37 +1,48 @@ -package draw2d - -import ( - "exp/draw" - "image" - "math" -) - -type ImageFilter int - -const ( - LinearFilter ImageFilter = iota - BilinearFilter - BicubicFilter -) - +package draw2d + +import ( + "exp/draw" + "image" + "math" +) + +type ImageFilter int + +const ( + LinearFilter ImageFilter = iota + BilinearFilter + BicubicFilter +) + //see http://pippin.gimp.org/image_processing/chap_resampling.html -func getColorLinear(img image.Image, x, y float64) image.Color { - return img.At(int(x), int(y)) -} - -func getColorBilinear(img image.Image, x, y float64) image.Color { - x0 := math.Floor(x) - y0 := math.Floor(y) - dx := x - x0 - dy := y - y0 - - color0 := img.At(int(x0), int(y0)) - color1 := img.At(int(x0+1), int(y0)) - color2 := img.At(int(x0+1), int(y0+1)) - color3 := img.At(int(x0), int(y0+1)) - - return lerp(lerp(color0, color1, dx), lerp(color3, color2, dx), dy) -} +func getColorLinear(img image.Image, x, y float64) image.Color { + return img.At(int(x), int(y)) +} + +func getColorBilinear(img image.Image, x, y float64) image.Color { + x0 := math.Floor(x) + y0 := math.Floor(y) + dx := x - x0 + dy := y - y0 + + c0 := img.At(int(x0), int(y0)) + c1 := img.At(int(x0+1), int(y0)) + c2 := img.At(int(x0+1), int(y0+1)) + c3 := img.At(int(x0), int(y0+1)) + rt, gt, bt, at := c0.RGBA() + r0, g0, b0, a0 := float64(rt), float64(gt), float64(bt), float64(at) + rt, gt, bt, at = c1.RGBA() + r1, g1, b1, a1 := float64(rt), float64(gt), float64(bt), float64(at) + rt, gt, bt, at = c2.RGBA() + r2, g2, b2, a2 := float64(rt), float64(gt), float64(bt), float64(at) + rt, gt, bt, at = c3.RGBA() + r3, g3, b3, a3 := float64(rt), float64(gt), float64(bt), float64(at) + r := int(lerp(lerp(r0, r1, dx), lerp(r3, r2, dx), dy)) + g := int(lerp(lerp(g0, g1, dx), lerp(g3, g2, dx), dy)) + b := int(lerp(lerp(b0, b1, dx), lerp(b3, b2, dx), dy)) + a := int(lerp(lerp(a0, a1, dx), lerp(a3, a2, dx), dy)) + return image.RGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)} +} /** -- LERP -- /lerp/, vi.,n. @@ -39,110 +50,104 @@ func getColorBilinear(img image.Image, x, y float64) image.Color { -- Quasi-acronym for Linear Interpolation, used as a verb or noun for -- the operation. "Bresenham's algorithm lerps incrementally between the -- two endpoints of the line." (From Jargon File (4.4.4, 14 Aug 2003) -*/ -func lerp(c1, c2 image.Color, ratio float64) image.Color { - r1, g1, b1, a1 := c1.RGBA() - r2, g2, b2, a2 := c2.RGBA() - r := int(float64(r1)*(1-ratio) + float64(r2)*ratio) - g := int(float64(g1)*(1-ratio) + float64(g2)*ratio) - b := int(float64(b1)*(1-ratio) + float64(b2)*ratio) - a := int(float64(a1)*(1-ratio) + float64(a2)*ratio) - return image.RGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)} -} - - -func getColorCubicRow(img image.Image, x, y, offset float64) image.Color { - c0 := img.At(int(x), int(y)) - c1 := img.At(int(x+1), int(y)) - c2 := img.At(int(x+2), int(y)) - c3 := img.At(int(x+3), int(y)) - rt, gt, bt, at := c0.RGBA() - r0, g0, b0, a0 := float64(rt), float64(gt), float64(bt), float64(at) - rt, gt, bt, at = c1.RGBA() - r1, g1, b1, a1 := float64(rt), float64(gt), float64(bt), float64(at) - rt, gt, bt, at = c2.RGBA() - r2, g2, b2, a2 := float64(rt), float64(gt), float64(bt), float64(at) - rt, gt, bt, at = c3.RGBA() - r3, g3, b3, a3 := float64(rt), float64(gt), float64(bt), float64(at) - r, g, b, a := cubic(offset, r0, r1, r2, r3), cubic(offset, g0, g1, g2, g3), cubic(offset, b0, b1, b2, b3), cubic(offset, a0, a1, a2, a3) - return image.RGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)} -} - -func getColorBicubic(img image.Image, x, y float64) image.Color { - x0 := math.Floor(x) - y0 := math.Floor(y) - dx := x - x0 - dy := y - y0 - c0 := getColorCubicRow(img, x0-1, y0-1, dx) - c1 := getColorCubicRow(img, x0-1, y0, dx) - c2 := getColorCubicRow(img, x0-1, y0+1, dx) - c3 := getColorCubicRow(img, x0-1, y0+2, dx) - rt, gt, bt, at := c0.RGBA() - r0, g0, b0, a0 := float64(rt), float64(gt), float64(bt), float64(at) - rt, gt, bt, at = c1.RGBA() - r1, g1, b1, a1 := float64(rt), float64(gt), float64(bt), float64(at) - rt, gt, bt, at = c2.RGBA() - r2, g2, b2, a2 := float64(rt), float64(gt), float64(bt), float64(at) - rt, gt, bt, at = c3.RGBA() - r3, g3, b3, a3 := float64(rt), float64(gt), float64(bt), float64(at) - r, g, b, a := cubic(dy, r0, r1, r2, r3), cubic(dy, g0, g1, g2, g3), cubic(dy, b0, b1, b2, b3), cubic(dy, a0, a1, a2, a3) - return image.RGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)} -} - -func cubic(offset, v0, v1, v2, v3 float64) uint32 { +*/ +func lerp(v1, v2, ratio float64) float64 { + return v1*(1-ratio) + v2*ratio +} + + +func getColorCubicRow(img image.Image, x, y, offset float64) image.Color { + c0 := img.At(int(x), int(y)) + c1 := img.At(int(x+1), int(y)) + c2 := img.At(int(x+2), int(y)) + c3 := img.At(int(x+3), int(y)) + rt, gt, bt, at := c0.RGBA() + r0, g0, b0, a0 := float64(rt), float64(gt), float64(bt), float64(at) + rt, gt, bt, at = c1.RGBA() + r1, g1, b1, a1 := float64(rt), float64(gt), float64(bt), float64(at) + rt, gt, bt, at = c2.RGBA() + r2, g2, b2, a2 := float64(rt), float64(gt), float64(bt), float64(at) + rt, gt, bt, at = c3.RGBA() + r3, g3, b3, a3 := float64(rt), float64(gt), float64(bt), float64(at) + r, g, b, a := cubic(offset, r0, r1, r2, r3), cubic(offset, g0, g1, g2, g3), cubic(offset, b0, b1, b2, b3), cubic(offset, a0, a1, a2, a3) + return image.RGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)} +} + +func getColorBicubic(img image.Image, x, y float64) image.Color { + x0 := math.Floor(x) + y0 := math.Floor(y) + dx := x - x0 + dy := y - y0 + c0 := getColorCubicRow(img, x0-1, y0-1, dx) + c1 := getColorCubicRow(img, x0-1, y0, dx) + c2 := getColorCubicRow(img, x0-1, y0+1, dx) + c3 := getColorCubicRow(img, x0-1, y0+2, dx) + rt, gt, bt, at := c0.RGBA() + r0, g0, b0, a0 := float64(rt), float64(gt), float64(bt), float64(at) + rt, gt, bt, at = c1.RGBA() + r1, g1, b1, a1 := float64(rt), float64(gt), float64(bt), float64(at) + rt, gt, bt, at = c2.RGBA() + r2, g2, b2, a2 := float64(rt), float64(gt), float64(bt), float64(at) + rt, gt, bt, at = c3.RGBA() + r3, g3, b3, a3 := float64(rt), float64(gt), float64(bt), float64(at) + r, g, b, a := cubic(dy, r0, r1, r2, r3), cubic(dy, g0, g1, g2, g3), cubic(dy, b0, b1, b2, b3), cubic(dy, a0, a1, a2, a3) + return image.RGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)} +} + +func cubic(offset, v0, v1, v2, v3 float64) uint32 { // offset is the offset of the sampled value between v1 and v2 - return uint32(((((-7*v0+21*v1-21*v2+7*v3)*offset+ - (15*v0-36*v1+27*v2-6*v3))*offset+ - (-9*v0+9*v2))*offset + (v0 + 16*v1 + v2)) / 18.0) -} - -func compose(c1, c2 image.Color) image.Color { - r1, g1, b1, a1 := c1.RGBA() - r2, g2, b2, a2 := c2.RGBA() - ia := M - a2 - r := ((r1 * ia) / M) + r2 - g := ((g1 * ia) / M) + g2 - b := ((b1 * ia) / M) + b2 - a := ((a1 * ia) / M) + a2 - return image.RGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)} -} - - -func DrawImage(src image.Image, dest draw.Image, tr MatrixTransform, op draw.Op, filter ImageFilter) { - b := src.Bounds() - x0, y0, x1, y1 := float64(b.Min.X), float64(b.Min.Y), float64(b.Max.X), float64(b.Max.Y) - tr.TransformRectangle(&x0, &y0, &x1, &y1) - var x, y, u, v float64 - for x = x0; x < x1; x++ { - for y = y0; y < y1; y++ { - u = x - v = y - tr.InverseTransform(&u, &v) - c1 := dest.At(int(x), int(y)) - var c2 image.Color - switch filter { - case LinearFilter: - c2 = src.At(int(u), int(v)) - case BilinearFilter: - c2 = getColorBilinear(src, u, v) - case BicubicFilter: - c2 = getColorBicubic(src, u, v) - } - var cr image.Color - switch op { - case draw.Over: - r1, g1, b1, a1 := c1.RGBA() - r2, g2, b2, a2 := c2.RGBA() - ia := M - a2 - r := ((r1 * ia) / M) + r2 - g := ((g1 * ia) / M) + g2 - b := ((b1 * ia) / M) + b2 - a := ((a1 * ia) / M) + a2 - cr = image.RGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)} - default: - cr = c2 - } - dest.Set(int(x), int(y), cr) - } - } -} + return uint32(((((-7*v0+21*v1-21*v2+7*v3)*offset+ + (15*v0-36*v1+27*v2-6*v3))*offset+ + (-9*v0+9*v2))*offset + (v0 + 16*v1 + v2)) / 18.0) +} + +func compose(c1, c2 image.Color) image.Color { + r1, g1, b1, a1 := c1.RGBA() + r2, g2, b2, a2 := c2.RGBA() + ia := M - a2 + r := ((r1 * ia) / M) + r2 + g := ((g1 * ia) / M) + g2 + b := ((b1 * ia) / M) + b2 + a := ((a1 * ia) / M) + a2 + return image.RGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)} +} + + +func DrawImage(src image.Image, dest draw.Image, tr MatrixTransform, op draw.Op, filter ImageFilter) { + b := src.Bounds() + x0, y0, x1, y1 := float64(b.Min.X), float64(b.Min.Y), float64(b.Max.X), float64(b.Max.Y) + tr.TransformRectangle(&x0, &y0, &x1, &y1) + var x, y, u, v float64 + for x = x0; x < x1; x++ { + for y = y0; y < y1; y++ { + u = x + v = y + tr.InverseTransform(&u, &v) + c1 := dest.At(int(x), int(y)) + var c2 image.Color + switch filter { + case LinearFilter: + c2 = src.At(int(u), int(v)) + case BilinearFilter: + c2 = getColorBilinear(src, u, v) + case BicubicFilter: + c2 = getColorBicubic(src, u, v) + } + var cr image.Color + switch op { + case draw.Over: + r1, g1, b1, a1 := c1.RGBA() + r2, g2, b2, a2 := c2.RGBA() + ia := M - a2 + r := ((r1 * ia) / M) + r2 + g := ((g1 * ia) / M) + g2 + b := ((b1 * ia) / M) + b2 + a := ((a1 * ia) / M) + a2 + cr = image.RGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)} + default: + cr = c2 + } + dest.Set(int(x), int(y), cr) + } + } +} diff --git a/resource/result/TestDrawImage.png b/resource/result/TestDrawImage.png index ba1c4fbe8c712b2c0336128530f1bbe32a69ea1d..783652378a22d67ef3d27e77aeed4dd343c20204 100644 GIT binary patch literal 23508 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