Method: Magick::Image#convolve

Defined in:
ext/RMagick/rmimage.c

#convolve(order_arg, kernel_arg) ⇒ Object

Apply a custom convolution kernel to the image.

Ruby usage:

- @verbatim Image#convolve(order, kernel) @endverbatim

Parameters:

  • self

    this object

  • order_arg

    the number of rows and columns in the kernel

  • kernel_arg

    an order**2 array of doubles

Returns:

  • a new image

[View source]

4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
# File 'ext/RMagick/rmimage.c', line 4098

VALUE
Image_convolve(VALUE self, VALUE order_arg, VALUE kernel_arg)
{
    Image *image, *new_image;
    double *kernel;
    unsigned int x, order;
    ExceptionInfo exception;

    image = rm_check_destroyed(self);

    order = NUM2UINT(order_arg);

    kernel_arg = rb_Array(kernel_arg);
    rm_check_ary_len(kernel_arg, (long)(order*order));

    // Convert the kernel array argument to an array of doubles

    kernel = (double *)ALLOC_N(double, order*order);
    for (x = 0; x < order*order; x++)
    {
        kernel[x] = NUM2DBL(rb_ary_entry(kernel_arg, (long)x));
    }

    GetExceptionInfo(&exception);

    new_image = ConvolveImage((const Image *)image, order, (double *)kernel, &exception);
    xfree((void *)kernel);
    rm_check_exception(&exception, new_image, DestroyOnError);

    (void) DestroyExceptionInfo(&exception);

    rm_ensure_result(new_image);

    return rm_image_new(new_image);
}