[gdal-dev] Converting .NET Bitmap to GDAL Dataset

Tamas Szekeres szekerest at gmail.com
Sun Mar 24 09:24:51 PDT 2013


We could also convert the bitmap to png or some other formats that the GDAL
drivers reconise, something like:

        byte[] imageBuffer;
        using (MemoryStream stream = new MemoryStream())
        {
            bmp.Save(stream, ImageFormat.Png);
            imageBuffer = stream.ToArray();
        }

        Gdal.FileFromMemBuffer(memFilename, imageBuffer);
        Dataset ds = Gdal.Open(memFilename, Access.GA_ReadOnly);


Best regards,

Tamas



2013/3/24 Tamas Szekeres <szekerest at gmail.com>

> This is because there's no driver to recognise the image data directly.
> You should provide the image file in a GDAL supported binary format (like
> jpg or png or tif) or use the MEM driver to represent the dataset. I've
> created a new sample for this approach at:
>
>
> http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/GDALMemDataset.cs
>
> In this example I create the bands in a reverse order as it looks like the
> Windows bitmap format requires it.
>
>
> Best regards,
>
> Tamas
>
>
>
> 2013/3/23 Maksim Sestic <max at geoinova.com>
>
>>  It's a Bitmap instance created using:****
>>
>> ** **
>>
>> Dim bmp As Bitmap = Bitmap.FromFile("C:\Input.png")****
>>
>> ** **
>>
>> then converted to byte array (as per MSDN article):****
>>
>> ** **
>>
>> ' Lock the bitmap's bits.****
>>
>> Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)****
>>
>> Dim bmpData As BitmapData = bmp.LockBits(rect, ImageLockMode.ReadOnly,
>> bmp.PixelFormat)****
>>
>> ** **
>>
>> ' Get the address of the first line.****
>>
>> Dim ptr As IntPtr = bmpData.Scan0****
>>
>> ** **
>>
>> ' Declare an array to hold the bytes of the bitmap.****
>>
>> Dim bitmapData As Byte()****
>>
>> ReDim bitmapData(Math.Abs(bmpData.Stride) * bmp.Height)****
>>
>> ** **
>>
>> ' Copy the RGB values into the array.****
>>
>> Marshal.Copy(ptr, bitmapData, 0, bitmapData.Length)****
>>
>> ** **
>>
>> ' Unlock the bits.****
>>
>> bmp.UnlockBits(bmpData)****
>>
>> ** **
>>
>> The rest is your code (abbreviated version):****
>>
>> ** **
>>
>> 'Code provided by Tamas Szekeres****
>>
>> Gdal.AllRegister()****
>>
>> Dim handle As GCHandle = GCHandle.Alloc(bitmapData, GCHandleType.Pinned)*
>> ***
>>
>> Dim memFilename As String = "/vsimem/inmemfile"****
>>
>> Gdal.FileFromMemBuffer(memFilename, bitmapData.Length,
>> handle.AddrOfPinnedObject())****
>>
>> Dim ds As Dataset = Gdal.Open(memFilename, Access.GA_ReadOnly)     '<<<
>> Exception gets thrown at this line****
>>
>> Dim drv As Driver = Gdal.GetDriverByName("GTiff")****
>>
>> drv.CreateCopy("C:\Output.tif", ds, 0, Nothing, Nothing, Nothing)****
>>
>> Gdal.Unlink(memFilename)****
>>
>> handle.Free()****
>>
>> ** **
>>
>> Sorry about my VB.NET :-) ****
>>
>> ** **
>>
>> I'm certain it's not about assembly referencing issues and such, since it
>> works correctly using "classic" Gdal.Open(...) method.****
>>
>> ** **
>>
>> Regards,****
>>
>> Maksim Sestic****
>>
>> ** **
>>
>> ** **
>>  ------------------------------
>>
>> *From:* Tamas Szekeres [mailto:szekerest at gmail.com]
>> *Sent:* Saturday, March 23, 2013 23:46
>>
>> *To:* Maksim Sestic
>> *Subject:* Re: [gdal-dev] Converting .NET Bitmap to GDAL Dataset
>> ****
>>
>>  ** **
>>
>> What is the input file you are using?****
>>
>> ** **
>>
>> Tamas****
>>
>> ** **
>>
>> 2013/3/23 Maksim Sestic <max at geoinova.com>****
>>
>> Hi Tamas,****
>>
>>  ****
>>
>> It throws exception at line:****
>>
>>  ****
>>
>> Dataset ds = Gdal.Open(memFilename, Access.GA_ReadOnly);****
>>
>>  ****
>>
>> ...saying that "/vsimem/inmemfile" is not a recognized format.****
>>
>>  ****
>>
>> I'm using GDAL 1.8.0, could it be version-related?****
>>
>>  ****
>>
>> Regards,****
>>
>> Maksim Sestic ****
>>
>>  ****
>>  ------------------------------
>>
>> *From:* Tamas Szekeres [mailto:szekerest at gmail.com]
>> *Sent:* Saturday, March 23, 2013 22:11****
>>
>>
>> *To:* Maksim Sestic
>> *Subject:* Re: [gdal-dev] Converting .NET Bitmap to GDAL Dataset****
>>
>>  ****
>>
>> Added a C# example to demonstrate the usage of the /vsimem facilities.***
>> *
>>
>>  ****
>>
>> http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/VSIMem.cs*
>> ***
>>
>>  ****
>>
>> Best regards,****
>>
>>  ****
>>
>> Tamas****
>>
>>  ****
>>
>>  ****
>>
>>  ****
>>
>> 2013/3/23 Maksim Sestic <max at geoinova.com>****
>>
>> Hi Tamas,****
>>
>>  ****
>>
>> Thanks for the help. I recall hitting this issue before as well:
>> http://lists.osgeo.org/pipermail/gdal-dev/2012-May/032972.html****
>>
>>  ****
>>
>> Regards,****
>>
>> Maksim Sestic****
>>
>>  ****
>>
>> P.S.****
>>
>> Sorry, just noticed that the conversation went to priv. only and not to
>> gdal-dev forum.****
>>
>>  ****
>>  ------------------------------
>>
>> *From:* Tamas Szekeres [mailto:szekerest at gmail.com]
>> *Sent:* Saturday, March 23, 2013 10:56****
>>
>>
>> *To:* Maksim Sestic
>> *Subject:* Re: [gdal-dev] Converting .NET Bitmap to GDAL Dataset****
>>
>>  ****
>>
>> You may probably utilize the MEM driver (
>> http://www.gdal.org/frmt_mem.html) or the vsimem virtual file system
>> http://gdal.org/cpl__vsi_8h.html#a66e2e6f093fd42f8a941b962d4c8a19e****
>>
>>  ****
>>
>> Best regards,****
>>
>>  ****
>>
>> Tamas****
>>
>>  ****
>>
>> 2013/3/22 Maksim Sestic <max at geoinova.com>****
>>
>> Hi Tamas,****
>>
>>  ****
>>
>> You're right, thanks. ****
>>
>>  ****
>>
>> I was trying to create a pair of "roundtrip" classes utilizing Gdal.
>> First one would read e.g. a file into Bitmap instance, that's what
>> GDALRead.cs demonstrates perfectly. The other would write this Bitmap
>> instance using Gdal drivers back to e.g. another file. You might have
>> guessed that I was stuck at the second one. I neve actually coded against
>> Gdal memory driver, should give it a try I guess...****
>>
>>  ****
>>
>> Regards,****
>>
>> Maksim Sestic****
>>
>>  ****
>>  ------------------------------
>>
>> *From:* Tamas Szekeres [mailto:szekerest at gmail.com]
>> *Sent:* Friday, March 22, 2013 22:58
>> *To:* Maksim Sestic
>> *Subject:* Re: [gdal-dev] Converting .NET Bitmap to GDAL Dataset****
>>
>>  ****
>>
>> Dataset is considered as an interface to the underlying driver. Aside
>> from the 'in memory driver' and some sort of internal caching facilities
>> the dataset doesn't hold data in memory. In this regard we cannot convert
>> these 2 objects types to each other. The most obvious action regarding to
>> your requirement is to create and in memory dataset and copy data from the
>> bitmap to the dataset, as I've mentioned before.****
>>
>>  ****
>>
>> Best regards,****
>>
>>  ****
>>
>> Tamas****
>>
>>  ****
>>
>>  ****
>>
>> 2013/3/22 Maksim Sestic <max at geoinova.com>****
>>
>> Hi Tamas,****
>>
>>  ****
>>
>> If I'm not mistaken, GDALWrite.cs and GDALDatasetWrite.cs examples are
>> about writing (using Create() method) a dataset to disk. What I'm trying to
>> do is to convert a System.Drawing.Bitmap instance to a GDAL.Dataset,
>> in-memory only. But I'm not sure about how to do it...****
>>
>>  ****
>>
>> Regards,****
>>
>> Maksim Sestic****
>>
>>  ****
>>
>>  ****
>>  ------------------------------
>>
>> *From:* gdal-dev-bounces at lists.osgeo.org [mailto:
>> gdal-dev-bounces at lists.osgeo.org] *On Behalf Of *Tamas Szekeres
>> *Sent:* Friday, March 22, 2013 21:12
>> *To:* gdal-dev
>> *Subject:* [gdal-dev] Converting .NET Bitmap to GDAL Dataset****
>>
>>  ****
>>
>>  ****
>>
>> For an example of the reverse action see SaveBitMapDirect in
>> GDALReadDirect.cs<http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/GDALReadDirect.cs>
>>  ****
>>
>> To write data to GDAL dataset see: GDALWrite.cs<http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/GDALWrite.cs>or
>> GDALDatasetWrite.cs<http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/GDALDatasetWrite.cs>
>> ****
>>
>>  ****
>>
>> Best regards,****
>>
>>  ****
>>
>> Tamas****
>>
>>  ****
>>
>>  ****
>>
>> 2013/3/22 Maksim Sestic <max at geoinova.com>****
>>
>> Hi all,
>>
>> Is there any example (or a hint) of converting a System.Drawing.Bitmap
>> into
>> GDAL Dataset?
>>
>> Regards,
>> Maksim Sestic
>>
>>
>>
>> --
>> View this message in context:
>> http://osgeo-org.1560.n6.nabble.com/Converting-NET-Bitmap-to-GDAL-Dataset-tp5042430.html
>> Sent from the GDAL - Dev mailing list archive at Nabble.com.
>> _______________________________________________
>> gdal-dev mailing list
>> gdal-dev at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/gdal-dev****
>>
>>  ****
>>
>>  ****
>>
>>  ****
>>
>>  ****
>>
>>  ****
>>
>> ** **
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20130324/532551bc/attachment-0001.html>


More information about the gdal-dev mailing list