diff --git a/process.go b/process.go index e1fad9bf..503a89b0 100644 --- a/process.go +++ b/process.go @@ -304,6 +304,20 @@ func processImage(data []byte, imgtype imageType, po processingOptions, t *timer t.Check() } + if po.Blur > 0 { + if err = vipsBlur(&img, po.Blur); err != nil { + return nil, err + } + } + + if po.Sharpen > 0 { + if err = vipsSharpen(&img, po.Sharpen); err != nil { + return nil, err + } + } + + t.Check() + return vipsSaveImage(img, po.Format) } @@ -426,6 +440,28 @@ func vipsSmartCrop(img **C.struct__VipsImage, width, height int) error { return nil } +func vipsBlur(img **C.struct__VipsImage, sigma float32) error { + var tmp *C.struct__VipsImage + + if C.vips_gaussblur_go(*img, &tmp, C.double(sigma)) != 0 { + return vipsError() + } + + C.swap_and_clear(img, tmp) + return nil +} + +func vipsSharpen(img **C.struct__VipsImage, sigma float32) error { + var tmp *C.struct__VipsImage + + if C.vips_sharpen_go(*img, &tmp, C.double(sigma)) != 0 { + return vipsError() + } + + C.swap_and_clear(img, tmp) + return nil +} + func vipsImportColourProfile(img **C.struct__VipsImage) error { var tmp *C.struct__VipsImage diff --git a/processing_options.go b/processing_options.go index 7d8cd316..c92cf863 100644 --- a/processing_options.go +++ b/processing_options.go @@ -214,6 +214,34 @@ func applyGravityOption(po *processingOptions, args []string) error { return nil } +func applyBlurOption(po *processingOptions, args []string) error { + if len(args) > 1 { + return fmt.Errorf("Invalid blur arguments: %v", args) + } + + if b, err := strconv.ParseFloat(args[0], 32); err == nil || b >= 0 { + po.Blur = float32(b) + } else { + return fmt.Errorf("Invalid blur: %s", args[0]) + } + + return nil +} + +func applySharpenOption(po *processingOptions, args []string) error { + if len(args) > 1 { + return fmt.Errorf("Invalid sharpen arguments: %v", args) + } + + if s, err := strconv.ParseFloat(args[0], 32); err == nil || s >= 0 { + po.Sharpen = float32(s) + } else { + return fmt.Errorf("Invalid sharpen: %s", args[0]) + } + + return nil +} + func applyFormatOption(po *processingOptions, imgType imageType) error { if !vipsTypeSupportSave[imgType] { return errors.New("Resulting image type not supported") @@ -250,6 +278,14 @@ func applyProcessingOption(po *processingOptions, name string, args []string) er if err := applyGravityOption(po, args); err != nil { return err } + case "blur": + if err := applyBlurOption(po, args); err != nil { + return err + } + case "sharpen": + if err := applySharpenOption(po, args); err != nil { + return err + } } return nil diff --git a/vips.h b/vips.h index 5e90c1db..c4a8d9f9 100644 --- a/vips.h +++ b/vips.h @@ -180,6 +180,16 @@ vips_smartcrop_go(VipsImage *in, VipsImage **out, int width, int height) { #endif } +int +vips_gaussblur_go(VipsImage *in, VipsImage **out, double sigma) { + return vips_gaussblur(in, out, sigma, NULL); +} + +int +vips_sharpen_go(VipsImage *in, VipsImage **out, double sigma) { + return vips_sharpen(in, out, "sigma", sigma, NULL); +} + int vips_extract_area_go(VipsImage *in, VipsImage **out, int left, int top, int width, int height) { return vips_extract_area(in, out, left, top, width, height, NULL);