CropImage
From Ogre Wiki
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)

