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

Reply via email to