Method: Magick::Image#get_pixels
- Defined in:
- ext/RMagick/rmimage.cpp
#get_pixels(x_arg, y_arg, cols_arg, rows_arg) ⇒ Array<Magick::Pixel>
Gets the pixels from the specified rectangle within the image.
7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899 7900 7901 |
# File 'ext/RMagick/rmimage.cpp', line 7819
VALUE
Image_get_pixels(VALUE self, VALUE x_arg, VALUE y_arg, VALUE cols_arg, VALUE rows_arg)
{
Image *image;
ExceptionInfo *exception;
long x, y;
unsigned long columns, rows;
long size, n;
VALUE pixel_ary;
#if defined(IMAGEMAGICK_7)
const Quantum *pixels;
#else
const PixelPacket *pixels;
const IndexPacket *indexes;
#endif
image = rm_check_destroyed(self);
x = NUM2LONG(x_arg);
y = NUM2LONG(y_arg);
columns = NUM2ULONG(cols_arg);
rows = NUM2ULONG(rows_arg);
if ((x+columns) > image->columns || (y+rows) > image->rows)
{
rb_raise(rb_eRangeError, "geometry (%lux%lu%+ld%+ld) exceeds image bounds",
columns, rows, x, y);
}
// Cast AcquireImagePixels to get rid of the const qualifier. We're not going
// to change the pixels but I don't want to make "pixels" const.
exception = AcquireExceptionInfo();
GVL_STRUCT_TYPE(GetVirtualPixels) args = { image, x, y, columns, rows, exception };
void *ret = CALL_FUNC_WITHOUT_GVL(GVL_FUNC(GetVirtualPixels), &args);
pixels = reinterpret_cast<decltype(pixels)>(ret);
CHECK_EXCEPTION();
DestroyExceptionInfo(exception);
// If the function failed, return a 0-length array.
if (!pixels)
{
return rb_ary_new();
}
// Allocate an array big enough to contain the PixelPackets.
size = (long)(columns * rows);
pixel_ary = rb_ary_new2(size);
#if defined(IMAGEMAGICK_6)
indexes = GetVirtualIndexQueue(image);
#endif
// Convert the PixelPackets to Magick::Pixel objects
for (n = 0; n < size; n++)
{
#if defined(IMAGEMAGICK_7)
PixelPacket color;
memset(&color, 0, sizeof(color));
color.red = GetPixelRed(image, pixels);
color.green = GetPixelGreen(image, pixels);
color.blue = GetPixelBlue(image, pixels);
color.alpha = GetPixelAlpha(image, pixels);
color.black = GetPixelBlack(image, pixels);
rb_ary_store(pixel_ary, n, Pixel_from_PixelPacket(&color));
pixels += GetPixelChannels(image);
#else
MagickPixel mpp;
mpp.red = GetPixelRed(pixels);
mpp.green = GetPixelGreen(pixels);
mpp.blue = GetPixelBlue(pixels);
mpp.opacity = GetPixelOpacity(pixels);
if (indexes)
{
mpp.index = GetPixelIndex(indexes + n);
}
rb_ary_store(pixel_ary, n, Pixel_from_MagickPixel(&mpp));
pixels++;
#endif
}
return pixel_ary;
}
|