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

Reply via email to