Why Is This Useful?
The ability to obtain arbitrary sections of an image has multiple applications. For example, in a GUI, you might wish to pack your image assets into a single image-- using this code snippet you could then split that image back up into its components.
The Code
/** * Little utility function that crops an image * (Doesn't alter the source image, returns a cropped representation) * * @param source The source image * @param offsetX The X offset from the origin * @param offsetY The Y offset from the origin * @param width The width to crop to * @param height The height to crop to * * @return Returns the cropped representation of the source image if the parameters are valid, * otherwise, returns the source image. */ Ogre::Image cropImage(const Ogre::Image& source, size_t offsetX, size_t offsetY, size_t width, size_t height) { if(offsetX + width > source.getWidth()) return source; else if(offsetY + height > source.getHeight()) return source; size_t bpp = Ogre::PixelUtil::getNumElemBytes(source.getFormat()); const unsigned char *srcData = source.getData(); unsigned char *dstData = new unsigned char[width * height * bpp]; size_t srcPitch = source.getRowSpan(); size_t dstPitch = width * bpp; for(size_t row = 0; row < height; row++) { for(size_t col = 0; col < width * bpp; col++) { dstData[(row * dstPitch) + col] = srcData[((row + offsetY) * srcPitch) + (offsetX * bpp) + col]; } } Ogre::Image croppedImage; croppedImage.loadDynamicImage(dstData, width, height, 1, source.getFormat(), true); return croppedImage; }
--Ajs15822 07:37, 7 February 2008 (GMT)