static Magick::Image* ImageCtor_layer(iTJSDispatch2* lay) { unsigned int w, h; unsigned char *p; long s; if (!lay || TJS_FAILED(lay->IsInstanceOf(0, 0, 0, TJS_W("Layer"), lay))) TVPThrowExceptionMessage(TJS_W("Magick::Image: _layer method needs Layer-instance param.")); // レイヤサイズ取得 tTJSVariant tmp[2]; lay->PropGet(0, TJS_W("imageWidth"), 0, &tmp[0], lay); lay->PropGet(0, TJS_W("imageHeight"), 0, &tmp[1], lay); w = static_cast<unsigned int>((tTVInteger)tmp[0]); h = static_cast<unsigned int>((tTVInteger)tmp[1]); // バッファ取得 lay->PropGet(0, TJS_W("mainImageBuffer"), 0, &tmp[0], lay); lay->PropGet(0, TJS_W("mainImageBufferPitch"), 0, &tmp[1], lay); p = reinterpret_cast<unsigned char*>((tTVInteger)tmp[0]); s = static_cast<long >((tTVInteger)tmp[1]); typedef Magick::PixelPacket PixelT; typedef Magick::Color ColorT; Magick::Image *image = new Magick::Image(Magick::Geometry(w, h), ColorT()); image->modifyImage(); image->type(Magick::TrueColorMatteType); // コピー if (sizeof(Magick::Quantum) == 1) { // 8bit quantum 専用 for (unsigned int y = 0; y < h; y++, p+=s) { unsigned char *cp = p; PixelT *q = image->getPixels(0, y, w, 1); for (int i = w; i > 0; i--, cp+=4) { *q++ = ColorT(static_cast<Magick::Quantum>(cp[2]), static_cast<Magick::Quantum>(cp[1]), static_cast<Magick::Quantum>(cp[0]), ~static_cast<Magick::Quantum>(cp[3])); } image->syncPixels(); } } else { // それ以外はdouble経由なので重い for (unsigned int y = 0; y < h; y++, p+=s) { unsigned char *cp = p; PixelT *q = image->getPixels(0, y, w, 1); for (int i = w; i > 0; i--, cp+=4) { Magick::ColorRGB col(cp[2]/255.0, cp[1]/255.0, cp[0]/255.0); col.alpha(cp[3]/255.0); *q++ = col; } image->syncPixels(); } } return image; }
void copyImage(Magick::Image& src, yarp::sig::ImageOf<yarp::sig::PixelRgb>& dest) { Magick::Geometry g = src.size(); int h = g.height(); int w = g.width(); src.depth(8); dest.resize(w,h); for (int i=0; i<h; i++) { // must transfer row by row, since YARP may use padding in representation Magick::PixelPacket *packet = src.getPixels(0,i,w,1); src.writePixels(Magick::RGBQuantum,(unsigned char *)(&dest.pixel(0,i))); } src.syncPixels(); }
void DrvSDL::WriteGif() { std::list<Magick::Image> gif; int num = 0; for(std::list<Magick::Blob>::iterator it = image_.begin(); it != image_.end(); it++) { Magick::Image image; image.magick("RGB"); image.depth(32); image.size(Magick::Geometry(cols_ * pixels.x, rows_ * pixels.y)); Magick::PixelPacket *pixel_cache = image.getPixels(0, 0, cols_ * pixels.x, rows_ * pixels.y); for(int n = 0; n < rows_ * pixels.y * cols_ * pixels.x; n++) { int col = ((int *)(*it).data())[n]; uint8_t *rgb = (uint8_t *) &col; Magick::PixelPacket *gif_pixel = pixel_cache + n; *gif_pixel = Magick::ColorRGB(rgb[0] / 256.0, rgb[1] / 256.0, rgb[2] / 256.0); } image.syncPixels(); gif.push_back(image); LCDInfo("Image %d", num++); } LCDInfo("Writing GIF image..."); for_each(gif.begin(), gif.end(), Magick::animationDelayImage(ani_speed_ / 10)); Magick::writeImages(gif.begin(), gif.end(), gif_file_); }
void imageToPixmap() { image.flip(); pixmap = image.getPixels(0, 0, image.columns(), image.rows()); }
Image::Image(GLuint filter, string filename, string alphaFilename) : filter(filter) { #if IMAGE_PRINT cout << "Loading image " << filename << "..." << endl; #endif Magick::Image image; image.read(filename); Magick::PixelPacket* data = image.getPixels(0, 0, image.columns(), image.rows()); width = image.columns(); height = image.rows(); #if IMAGE_PRINT cout << " Width: " << width << endl; cout << " Height: " << height << endl; #endif // Convert to floats and flip vertically pixels = new Color[width * height]; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { int idest = x + y * width; int isrc = x + (height - 1 - y) * width; pixels[idest] = { (float)data[isrc].red / USHRT_MAX, (float)data[isrc].green / USHRT_MAX, (float)data[isrc].blue / USHRT_MAX, 1.f - (float)data[isrc].opacity / USHRT_MAX }; } } // Load alpha map if (alphaFilename != "") { #if IMAGE_PRINT cout << " Alpha map found: " << alphaFilename << endl; #endif Magick::Image aImage; aImage.read(alphaFilename); Magick::PixelPacket* aData = aImage.getPixels(0, 0, aImage.columns(), aImage.rows()); int aWidth = aImage.columns(); int aHeight = aImage.rows(); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { if (x >= aWidth || y >= aHeight) continue; int idest = x + y * width; int isrc = x + (aHeight - 1 - y) * aWidth; pixels[idest].a((float)aData[isrc].red / USHRT_MAX); } } } createTexture(); }