From c753dbc3e6c217fbe74fae77c3ba38d64f1d1ddf Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 3 Apr 2015 13:29:31 +0000 Subject: [PATCH] Added automatic rotation of jpeg image based on EXIF rotation information provided in the header. git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14819 16af8721-9629-0410-8352-f15c8da7e697 --- src/osgPlugins/jpeg/ReaderWriterJPEG.cpp | 73 ++++++++++++++++++++---- 1 file changed, 61 insertions(+), 12 deletions(-) diff --git a/src/osgPlugins/jpeg/ReaderWriterJPEG.cpp b/src/osgPlugins/jpeg/ReaderWriterJPEG.cpp index 74be90cb8..3c1362cab 100644 --- a/src/osgPlugins/jpeg/ReaderWriterJPEG.cpp +++ b/src/osgPlugins/jpeg/ReaderWriterJPEG.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -856,7 +857,7 @@ class ReaderWriterJPEG : public osgDB::ReaderWriter unsigned int dataType = GL_UNSIGNED_BYTE; - osg::Image* pOsgImage = new osg::Image; + osg::ref_ptr pOsgImage = new osg::Image; pOsgImage->setImage(s,t,r, internalFormat, pixelFormat, @@ -869,19 +870,69 @@ class ReaderWriterJPEG : public osgDB::ReaderWriter // guide for meaning of exif_orientation provided by webpage: http://sylvana.net/jpegcrop/exif_orientation.html switch(exif_orientation) { - case(1): OSG_NOTICE<<"EXIF_Orientation 1 (top, left side), No need to rotate image. "<s()-1, 0, 0), + osg::Vec3i(-pOsgImage->s(), 0, 0), + osg::Vec3i(0, pOsgImage->t(), 0), + osg::Vec3i(0, 0, 1)); + break; + case(3): + OSG_INFO<<"EXIF_Orientation 3 (bottom, right side), rotate 180."<s()-1, pOsgImage->t()-1, 0), + osg::Vec3i(-pOsgImage->s(), 0, 0), + osg::Vec3i(0, -pOsgImage->t(), 0), + osg::Vec3i(0, 0, 1)); + break; + case(4): + OSG_INFO<<"EXIF_Orientation 4 (bottom, left side). flip y, rotate 180."<t()-1, 0), + osg::Vec3i(pOsgImage->s(), 0, 0), + osg::Vec3i(0, -pOsgImage->t(), 0), + osg::Vec3i(0, 0, 1)); + break; + case(5): + OSG_INFO<<"EXIF_Orientation 5 (left side, top). flip y, rotate 90."<s()-1, pOsgImage->t()-1, 0), + osg::Vec3i(0, -pOsgImage->t(), 0), + osg::Vec3i(-pOsgImage->s(), 0, 0), + osg::Vec3i(0, 0, 1)); + break; + case(6): + OSG_INFO<<"EXIF_Orientation 6 (right side, top). rotate 90."<s()-1, 0, 0), + osg::Vec3i(0, pOsgImage->t(), 0), + osg::Vec3i(-pOsgImage->s(), 0, 0), + osg::Vec3i(0, 0, 1)); + break; + case(7): + OSG_INFO<<"EXIF_Orientation 7 (right side, bottom), flip Y, rotate 270."<t(), 0), + osg::Vec3i(pOsgImage->s(), 0, 0), + osg::Vec3i(0, 0, 1)); + case(8): + OSG_INFO<<"EXIF_Orientation 8 (left side, bottom). rotate 270."<t()-1, 0), + osg::Vec3i(0, -pOsgImage->t(), 0), + osg::Vec3i(pOsgImage->s(), 0, 0), + osg::Vec3i(0, 0, 1)); + break; } } - return pOsgImage; + return pOsgImage.release(); } virtual ReadResult readObject(std::istream& fin,const osgDB::ReaderWriter::Options* options =NULL) const @@ -907,8 +958,6 @@ class ReaderWriterJPEG : public osgDB::ReaderWriter std::string fileName = osgDB::findDataFile( file, options ); if (fileName.empty()) return ReadResult::FILE_NOT_FOUND; - OSG_NOTICE<