func bilinear(im image.Image, scalex float32, scaley float32) (imageng, os.Error) { if scalex >= 1.0 && scaley >= 1.0 { ws := im.Bounds().Dx() hs := im.Bounds().Dy() wd := int(scalex * float32(ws)) hd := int(scaley * float32(hs)) scaled := imgType(im, wd, hd) var c00, c01, c10, c11 image.RGBA64Color var x0, x1, xs, ys, y0, y1 uint32 var r, g, b, a uint32 var r00, r11, r10, r01, g00, g11, g10, g01, b00, b11, b10, b01, a00, a11, a10, a01 uint32 var i, j uint32 ys = 1 for y := 1; y < hs; y++ { x0 = 0 x1 = 0 // not so sure xs = 1 y0 = y1 y1 = uint32(float32(ys) * scaley) c00 = image.RGBA64ColorModel.Convert(im.At(0, int(ys-1))).(image.RGBA64Color) c01 = image.RGBA64ColorModel.Convert(im.At(0, int(ys))).(image.RGBA64Color) c10 = image.RGBA64ColorModel.Convert(im.At(1, int(ys-1))).(image.RGBA64Color) c11 = image.RGBA64ColorModel.Convert(im.At(1, int(ys))).(image.RGBA64Color) for x := 1; x < ws; x++ { x0 = x1 x1 = uint32(float32(xs) * scalex) c00 = c10 c01 = c11 c10 = image.RGBA64ColorModel.Convert(im.At(int(xs), int(ys-1))).(image.RGBA64Color) c11 = image.RGBA64ColorModel.Convert(im.At(int(xs), int(ys))).(image.RGBA64Color) for j = y0; j < y1; j++ { for i = x0; i < x1; i++ { r00, g00, b00, a00 = c00.RGBA() r01, g01, b01, a01 = c01.RGBA() r10, g10, b10, a10 = c10.RGBA() r11, g11, b11, a11 = c11.RGBA() // print(r00, ", ", r01, ", ", r10, ", ", r11, "\n") r = ((r00*(x1-i)+r10*(i-x0))*(y1-j) + (r01*(x1-i)+r11*(i-x0))*(j-y0)) / ((x1 - x0) * (y1 - y0)) g = ((g00*(x1-i)+g10*(i-x0))*(y1-j) + (g01*(x1-i)+g11*(i-x0))*(j-y0)) / ((x1 - x0) * (y1 - y0)) b = ((b00*(x1-i)+b10*(i-x0))*(y1-j) + (b01*(x1-i)+b11*(i-x0))*(j-y0)) / ((x1 - x0) * (y1 - y0)) a = ((a00*(x1-i)+a10*(i-x0))*(y1-j) + (a01*(x1-i)+a11*(i-x0))*(j-y0)) / ((x1 - x0) * (y1 - y0)) scaled.Set(int(i), int(j), convertColor(im, image.RGBA64Color{uint16(r), uint16(g), uint16(b), uint16(a)})) } } xs++ } ys++ } return scaled, nil } return nil, os.NewError("no scaling down") }