Method: Magick::Image#export_pixels
- Defined in:
- ext/RMagick/rmimage.cpp
#export_pixels(x = 0, y = 0, cols = self.columns, rows = self.rows, map = "RGB") ⇒ Array<Numeric>
Extracts the pixel data from the specified rectangle and returns it as an array of Integer values. The array returned by #export_pixels is suitable for use as an argument to #import_pixels.
6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 |
# File 'ext/RMagick/rmimage.cpp', line 6610
VALUE
Image_export_pixels(int argc, VALUE *argv, VALUE self)
{
Image *image;
long x_off = 0L, y_off = 0L;
unsigned long cols, rows;
long n, npixels;
MagickBooleanType okay;
const char *map = "RGB";
Quantum *pixels;
VALUE ary;
ExceptionInfo *exception;
image = rm_check_destroyed(self);
cols = image->columns;
rows = image->rows;
switch (argc)
{
case 5:
map = StringValueCStr(argv[4]);
case 4:
rows = NUM2ULONG(argv[3]);
case 3:
cols = NUM2ULONG(argv[2]);
case 2:
y_off = NUM2LONG(argv[1]);
case 1:
x_off = NUM2LONG(argv[0]);
case 0:
break;
default:
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 5)", argc);
break;
}
if ( x_off < 0 || (unsigned long)x_off > image->columns
|| y_off < 0 || (unsigned long)y_off > image->rows
|| cols == 0 || rows == 0)
{
rb_raise(rb_eArgError, "invalid extract geometry");
}
npixels = (long)(cols * rows * strlen(map));
pixels = ALLOC_N(Quantum, npixels);
if (!pixels) // app recovered from exception
{
return rb_ary_new2(0L);
}
exception = AcquireExceptionInfo();
GVL_STRUCT_TYPE(ExportImagePixels) args = { image, x_off, y_off, cols, rows, map, QuantumPixel, (void *)pixels, exception };
void *ret = CALL_FUNC_WITHOUT_GVL(GVL_FUNC(ExportImagePixels), &args);
okay = static_cast<MagickBooleanType>(reinterpret_cast<intptr_t &>(ret));
if (!okay)
{
xfree((void *)pixels);
CHECK_EXCEPTION();
// Should never get here...
rm_magick_error("ExportImagePixels failed with no explanation.");
}
DestroyExceptionInfo(exception);
ary = rb_ary_new2(npixels);
for (n = 0; n < npixels; n++)
{
rb_ary_push(ary, QUANTUM2NUM(pixels[n]));
}
xfree((void *)pixels);
RB_GC_GUARD(ary);
return ary;
}
|