Пример #1
0
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")
}