Method: Magick::Image#export_pixels_to_str
- Defined in:
- ext/RMagick/rmimage.cpp
#export_pixels_to_str(x = 0, y = 0, cols = self.columns, rows = self.rows, map = "RGB", type = Magick::CharPixel) ⇒ String
Extracts the pixel data from the specified rectangle and returns it as a string.
6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 |
# File 'ext/RMagick/rmimage.cpp', line 6776
VALUE
Image_export_pixels_to_str(int argc, VALUE *argv, VALUE self)
{
Image *image;
long x_off = 0L, y_off = 0L;
unsigned long cols, rows;
unsigned long npixels;
size_t sz;
MagickBooleanType okay;
const char *map = "RGB";
StorageType type = CharPixel;
VALUE string;
ExceptionInfo *exception;
image = rm_check_destroyed(self);
cols = image->columns;
rows = image->rows;
switch (argc)
{
case 6:
VALUE_TO_ENUM(argv[5], type, StorageType);
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 6)", 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 = cols * rows * strlen(map);
switch (type)
{
case CharPixel:
sz = sizeof(unsigned char);
break;
case ShortPixel:
sz = sizeof(unsigned short);
break;
case DoublePixel:
sz = sizeof(double);
break;
case FloatPixel:
sz = sizeof(float);
break;
case LongPixel:
sz = sizeof(unsigned long);
break;
case QuantumPixel:
sz = sizeof(Quantum);
break;
case UndefinedPixel:
default:
rb_raise(rb_eArgError, "undefined storage type");
break;
}
// Allocate a string long enough to hold the exported pixel data.
// Get a pointer to the buffer.
string = rb_str_new2("");
rb_str_resize(string, (long)(sz * npixels));
exception = AcquireExceptionInfo();
GVL_STRUCT_TYPE(ExportImagePixels) args = { image, x_off, y_off, cols, rows, map, type, (void *)RSTRING_PTR(string), exception };
void *ret = CALL_FUNC_WITHOUT_GVL(GVL_FUNC(ExportImagePixels), &args);
okay = static_cast<MagickBooleanType>(reinterpret_cast<intptr_t &>(ret));
if (!okay)
{
// Let GC have the string buffer.
rb_str_resize(string, 0);
CHECK_EXCEPTION();
// Should never get here...
rm_magick_error("ExportImagePixels failed with no explanation.");
}
DestroyExceptionInfo(exception);
RB_GC_GUARD(string);
return string;
}
|