Method: Magick::Image#convolve
- Defined in:
- ext/RMagick/rmimage.cpp
#convolve(order_arg, kernel_arg) ⇒ Magick::Image
Apply a custom convolution kernel to the image.
4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 |
# File 'ext/RMagick/rmimage.cpp', line 4812
VALUE
Image_convolve(VALUE self, VALUE order_arg, VALUE kernel_arg)
{
Image *image, *new_image;
size_t order;
ExceptionInfo *exception;
#if defined(IMAGEMAGICK_7)
KernelInfo *kernel;
#else
double *kernel;
unsigned int x;
#endif
image = rm_check_destroyed(self);
if (NUM2INT(order_arg) <= 0)
{
rb_raise(rb_eArgError, "order must be non-zero and positive");
}
order = NUM2INT(order_arg);
kernel_arg = rb_Array(kernel_arg);
rm_check_ary_len(kernel_arg, (long)(order*order));
#if defined(IMAGEMAGICK_7)
kernel = convolve_create_kernel_info(order, kernel_arg);
#else
// Convert the kernel array argument to an array of doubles
kernel = (double *)ALLOC_N(double, order*order);
for (x = 0; x < (unsigned)(order * order); x++)
{
VALUE element = rb_ary_entry(kernel_arg, (long)x);
if (rm_check_num2dbl(element))
{
kernel[x] = NUM2DBL(element);
}
else
{
xfree((void *)kernel);
rb_raise(rb_eTypeError, "type mismatch: %s given", rb_class2name(CLASS_OF(element)));
}
}
#endif
exception = AcquireExceptionInfo();
#if defined(IMAGEMAGICK_7)
GVL_STRUCT_TYPE(ConvolveImage) args = { image, kernel, exception };
new_image = (Image *)CALL_FUNC_WITHOUT_GVL(GVL_FUNC(ConvolveImage), &args);
DestroyKernelInfo(kernel);
#else
GVL_STRUCT_TYPE(ConvolveImage) args = { image, order, kernel, exception };
new_image = (Image *)CALL_FUNC_WITHOUT_GVL(GVL_FUNC(ConvolveImage), &args);
xfree((void *)kernel);
#endif
rm_check_exception(exception, new_image, DestroyOnError);
DestroyExceptionInfo(exception);
return rm_image_new(new_image);
}
|