Hmm, well that was easy! The flipping of rows worked fine, to set the image I used GL_BGR for pixel format only, keeping GL_RGB as internal pixel format (else I got a gray square).
Thank you for an extremely helpful response :) Andrew On Thu, Aug 20, 2009 at 6:15 PM, Farshid Lashkari <[email protected]> wrote: > Hi Andrew, > It looks like the original bitmap is in BGR format, so you will probably > need to use the GL_BGR pixel format when calling setImage(). To unflip the > image it seems like you can iterate backwards over the source image inside > your copy loop: > > ptrSourceRow = ptrSrcImage + ( (iHeight - 1 - i) * iStride); > > I believe this should fix your problems. > > Cheers, > Farshid > > On Thu, Aug 20, 2009 at 9:46 AM, Andrew Thompson <[email protected]>wrote: > >> Hi there, >> >> I am trying to load an osg::Image using the setImage method - inparticular >> I am copying a Managed bitmap (System.Drawing.Bitmap) to the osg::Image to >> use it as a texture map. >> >> As you can see I'm having a few problems. Here's the osg::Image texture >> mapped onto a quad when I load it in from file using osgDB::readImageFile >> >> [Image: >> http://i137.photobucket.com/albums/q217/andyb1979/tquadreadimage.png ] >> >> Here's the same textured quad, but the osg::Image was created using >> setImage and a copy from a managed bitmap >> >> [Image: >> http://i137.photobucket.com/albums/q217/andyb1979/th_tquadsetimage.png ] >> >> As you can see the image seems to have been inverted and flipped! >> >> Here is my code to convert a managed bitmap to osg::Image. The input >> bitmap has been loaded from file, is in the format 24bpp RGB. >> >> I know I'm getting the size/bits per pixel right as the output osg::Image >> is the right shape and size, with no tearing. However I don't know why the >> image is inverted! >> >> >> Code: >> >> osg::ref_ptr<osg::Image> >> SceneUtil::ManagedBitmapToOSGImage(System::Drawing::Bitmap ^ bitmap) >> { >> // >> // Check params >> // >> >> if (bitmap == nullptr) >> { >> throw gcnew Exception("Unable to convert >> System::Drawing::Bitmap to osg::Image as the input image is null"); >> } >> >> if (bitmap->PixelFormat != >> System::Drawing::Imaging::PixelFormat::Format24bppRgb) >> { >> throw gcnew Exception("Unable to convert >> System::Drawing::Bitmap to osg::Image as the input image must be in the >> format Format24bppRgb"); >> } >> >> // Create a new OSG Image >> osg::ref_ptr<osg::Image> image = new osg::Image(); >> >> System::Drawing::Imaging::BitmapData ^ bitmapData = >> bitmap->LockBits( >> System::Drawing::Rectangle(0, 0, bitmap->Width, >> bitmap->Height), >> System::Drawing::Imaging::ImageLockMode::ReadOnly, >> System::Drawing::Imaging::PixelFormat::Format24bppRgb); >> >> // Create data to hold the destination image >> BYTE * ptrSrcImage = (BYTE*)bitmapData->Scan0.ToPointer(); >> BYTE * ptrDestImage = new unsigned char [bitmap->Width * >> bitmap->Height * 3]; >> BYTE * ptrSourceRow = nullptr; >> BYTE * ptrDestRow = nullptr; >> >> int iWidth = bitmapData->Width; >> int iHeight = bitmapData->Height; >> int iStride = bitmapData->Stride; >> >> // Copy the System::Drawing::Bitmap instance over line by line - >> this gets around the >> // lack of stride support in the osg::Image. >> for(int i = 0; i < iHeight; i++) >> { >> // Get the source row pointer >> ptrSourceRow = ptrSrcImage + (i * iStride); >> >> // Get the destination row pointer >> ptrDestRow = ptrDestImage + (i * (iWidth * 3)); >> >> // Copy the source row to the destination row >> memcpy(ptrDestRow, ptrSourceRow, iWidth * 3); >> } >> >> // Set the data on the osg::Image >> image->setImage( >> bitmap->Width, >> bitmap->Height, >> 1, >> GL_RGB, >> GL_RGB, >> GL_UNSIGNED_BYTE, >> ptrDestImage, >> osg::Image::USE_NEW_DELETE); >> >> bitmap->UnlockBits(bitmapData); >> >> return image; >> } >> >> >> >> >> Any ideas? >> >> Thank you! >> >> Andrew >> >> ------------------ >> Read this topic online here: >> http://forum.openscenegraph.org/viewtopic.php?p=16492#16492 >> >> >> >> >> >> _______________________________________________ >> osg-users mailing list >> [email protected] >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> > > > _______________________________________________ > osg-users mailing list > [email protected] > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > >
_______________________________________________ osg-users mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

