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 resize(mw *imagick.MagickWand, geo btcdn.GeoBox) (err error) { var height uint width := geo.Width() baseWidth := int(mw.GetImageWidth()) if width > baseWidth { width = baseWidth } if geo.Mode() == "!" { height = uint(geo.Height()) } else { ratio := heightToWidthRatio(mw) height = uint((float64)(width) * ratio) } err = mw.ResizeImage(uint(width), height, imagick.FILTER_LANCZOS, 1) if err != nil { return } return }