From 40a7f903ec2011e30adcbdb2f9c1c10b592ea5a1 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 3 Apr 2015 13:19:32 +0000 Subject: [PATCH] Implemented an osg::createImageWithOrientationConversion(...) method to aid for changing orientation of images. git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14818 16af8721-9629-0410-8352-f15c8da7e697 --- include/osg/ImageUtils | 3 +++ src/osg/ImageUtils.cpp | 54 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/include/osg/ImageUtils b/include/osg/ImageUtils index 5c7d1bd74..1ca7390bd 100644 --- a/include/osg/ImageUtils +++ b/include/osg/ImageUtils @@ -17,6 +17,7 @@ #include #include +#include namespace osg { @@ -238,6 +239,8 @@ enum ColorSpaceOperation /** Convert the RGBA values in a Image based on a ColorSpaceOperation defined scheme.*/ extern OSG_EXPORT osg::Image* colorSpaceConversion(ColorSpaceOperation op, osg::Image* image, const osg::Vec4& colour); +/** Create a copy of an osg::Image. converting the origin to standard lower left OpenGL style origin .*/ +extern OSG_EXPORT osg::Image* createImageWithOrientationConversion(const osg::Image* srcImage, const osg::Vec3i& srcOrigin, const osg::Vec3i& srcRow, const osg::Vec3i& srcColumn, const osg::Vec3i& srcLayer); } diff --git a/src/osg/ImageUtils.cpp b/src/osg/ImageUtils.cpp index 0f59b7322..fa49aa183 100644 --- a/src/osg/ImageUtils.cpp +++ b/src/osg/ImageUtils.cpp @@ -15,10 +15,12 @@ #include #include -#include #include #include +#include +#include + namespace osg { @@ -700,6 +702,56 @@ osg::Image* colorSpaceConversion(ColorSpaceOperation op, osg::Image* image, cons } +OSG_EXPORT osg::Image* createImageWithOrientationConversion(const osg::Image* srcImage, const osg::Vec3i& srcOrigin, const osg::Vec3i& srcRow, const osg::Vec3i& srcColumn, const osg::Vec3i& srcLayer) +{ + osg::ref_ptr dstImage = new osg::Image; + int width = osg::maximum(osg::maximum(osg::absolute(srcRow.x()), osg::absolute(srcRow.y())), osg::absolute(srcRow.z())); + int height = osg::maximum(osg::maximum(osg::absolute(srcColumn.x()), osg::absolute(srcColumn.y())), osg::absolute(srcColumn.z())); + int depth = osg::maximum(osg::maximum(osg::absolute(srcLayer.x()), osg::absolute(srcLayer.y())), osg::absolute(srcLayer.z())); + + osg::Vec3i rowDelta(osg::signOrZero(srcRow.x()), osg::signOrZero(srcRow.y()), osg::signOrZero(srcRow.z())); + osg::Vec3i columnDelta(osg::signOrZero(srcColumn.x()), osg::signOrZero(srcColumn.y()), osg::signOrZero(srcColumn.z())); + osg::Vec3i layerDelta(osg::signOrZero(srcLayer.x()), osg::signOrZero(srcLayer.y()), osg::signOrZero(srcLayer.z())); + + unsigned int pixelSizeInBits = srcImage->getPixelSizeInBits(); + unsigned int pixelSizeInBytes = pixelSizeInBits/8; + unsigned int pixelSizeRemainder = pixelSizeInBits%8; + if (pixelSizeRemainder!=0) + { + OSG_NOTICE<<"Warning: createImageWithOrientationConversion(..) cannot handle non byte aligned pixel formats."<(srcImage); + } + + dstImage->allocateImage(width, height, depth, srcImage->getPixelFormat(), srcImage->getDataType()); + + // copy across the pixels from the source image to the destination image. + for(int l=0; ldata(cp.x(), cp.y(), cp.z()); + unsigned char* dst_pixel = dstImage->data(c, r, l); + for(unsigned int i=0; i