Ref<Image> loadMagick(const FileName& fileName) { Magick::Image image(fileName.c_str()); Image* out = new Image4uc(image.columns(),image.rows(),fileName); float rcpMaxRGB = 1.0f/float(MaxRGB); Magick::Pixels pixel_cache(image); Magick::PixelPacket* pixels = pixel_cache.get(0,0,out->width,out->height); switch (image.orientation()) { case UndefinedOrientation: case TopLeftOrientation: { for (size_t y=0; y<out->height; y++) { for (size_t x=0; x<out->width; x++) { Color4 c; c.r = float(pixels[y*out->width+x].red)*rcpMaxRGB; c.g = float(pixels[y*out->width+x].green)*rcpMaxRGB; c.b = float(pixels[y*out->width+x].blue)*rcpMaxRGB; c.a = float(pixels[y*out->width+x].opacity)*rcpMaxRGB; out->set(x,out->height-y-1,c); } } break; } case BottomLeftOrientation: { for (size_t y=0; y<out->height; y++) { for (size_t x=0; x<out->width; x++) { Color4 c; c.r = float(pixels[y*out->width+x].red)*rcpMaxRGB; c.g = float(pixels[y*out->width+x].green)*rcpMaxRGB; c.b = float(pixels[y*out->width+x].blue)*rcpMaxRGB; c.a = float(pixels[y*out->width+x].opacity)*rcpMaxRGB; out->set(x,y,c); } } break; } default: { throw std::runtime_error("not supported image orientation"); } } return out; }
void storeMagick(const Ref<Image>& img, const FileName& fileName) { Magick::Image image(Magick::Geometry(img->width,img->height), Magick::ColorRGB(0,0,0)); image.modifyImage(); Magick::Pixels pixel_cache(image); Magick::PixelPacket* pixels = pixel_cache.get(0,0,img->width,img->height); for (size_t y=0; y<img->height; y++) { for (size_t x=0; x<img->width; x++) { Color4 c = img->get(x,y); pixels[y*img->width+x] = Magick::ColorRGB(Magick::Quantum(clamp(c.r)*MaxRGB), Magick::Quantum(clamp(c.g)*MaxRGB), Magick::Quantum(clamp(c.b)*MaxRGB)); } } pixel_cache.sync(); image.write(fileName.c_str()); }
Ref<Image> loadMagick(const FileName& fileName) { Magick::Image image(fileName.c_str()); Image* out = new Image4c(image.columns(),image.rows(),fileName); float rcpMaxRGB = 1.0f/float(MaxRGB); Magick::Pixels pixel_cache(image); Magick::PixelPacket* pixels = pixel_cache.get(0,0,out->width,out->height); for (size_t y=0; y<out->height; y++) { for (size_t x=0; x<out->width; x++) { Color4 c; c.r = float(pixels[y*out->width+x].red )*rcpMaxRGB; c.g = float(pixels[y*out->width+x].green )*rcpMaxRGB; c.b = float(pixels[y*out->width+x].blue )*rcpMaxRGB; c.a = float(pixels[y*out->width+x].opacity)*rcpMaxRGB; out->set(x,y,c); } } return out; }