func (pr *BimgProcessor) Process(buffer []byte, geo btcdn.GeoBox) (img btcdn.Image, err error) { bimgImg := bimg.NewImage(buffer) var newImage []byte gravity := resolveGravity(geo.Gravity()) if geo.Cropped() && geo.Resized() { newImage, err = resizeAndCrop(bimgImg, geo.Width(), geo.Height(), gravity) } else if geo.Resized() { if geo.Mode() == "!" { newImage, err = forceResize(bimgImg, geo.Width(), geo.Height()) } else { newImage, err = resize(bimgImg, geo.Width()) } } else if geo.Cropped() { newImage, err = crop(bimgImg, int(float64(geo.Offset()[1])), int(float64(geo.Offset()[0])), geo.Width(), geo.Height()) } if geo.Greyscale() { newImage, err = bimgImg.Colourspace(bimg.INTERPRETATION_B_W) } img = &Image{ body: newImage, mime: Mimes[bimgImg.Type()], } return }
func calculateGravityOffsets(baseWidth int, baseHeight int, geo btcdn.GeoBox) (offsetX int, offsetY int, err error) { cropWidth := geo.Width() cropHeight := geo.Height() if cropWidth > baseWidth { cropWidth = baseWidth } if cropHeight > cropHeight { cropHeight = baseHeight } switch geo.Gravity() { case "": offsetX = geo.Offset()[0] offsetY = geo.Offset()[1] case "c": offsetX = (baseWidth - cropWidth) / 2 offsetY = (baseHeight - cropHeight) / 2 case "n": offsetX = (baseWidth - cropWidth) / 2 offsetY = 0 case "nw": offsetX = 0 offsetY = 0 case "ne": offsetX = baseWidth - cropWidth offsetY = 0 case "s": offsetX = (baseWidth - cropWidth) / 2 offsetY = baseHeight - cropHeight case "sw": offsetX = 0 offsetY = baseHeight - cropHeight case "se": offsetX = baseWidth - cropWidth offsetY = baseHeight - cropHeight case "w": offsetX = 0 offsetY = (baseHeight - cropHeight) / 2 case "e": offsetX = baseWidth - cropWidth offsetY = (baseHeight - cropHeight) / 2 } return }