<div>After fixing a bug on my part I was able to figure it out. The only strange this was that the BandMap array had to declared in reverse order from what one would expect. This may be a GDI+ issue but here is my code snippet for the record:</div>

<div>&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim bd As BitmapData = TileBmp.LockBits(New Rectangle(0, 0, TileCropW, TileCropH), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim stride As Integer = bd.Stride<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim bandmap(3) As Integer</div>
<div>&#39;&nbsp;destination is ARGB but this is&nbsp;BGRA go figure<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bandmap(0) = 3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bandmap(1) = 2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bandmap(2) = 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bandmap(3) = 4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim buf As IntPtr = bd.Scan0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GdalDataSet.ReadRaster(curRasterX, curRasterY, CropW, CropH, buf, TileCropW, TileCropH, DataType.GDT_Byte, GdalDataSet.RasterCount, bandmap, 4, stride, 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allblack = False</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TileBmp.UnlockBits(bd)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Try<br><br></div>
<div class="gmail_quote">On Thu, Jan 8, 2009 at 1:26 PM, Tamas Szekeres <span dir="ltr">&lt;<a href="mailto:szekerest@gmail.com">szekerest@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">Eric,<br><br>You could refer to the RasterIO documentation regarding to these parameters:<br><a href="http://www.gdal.org/classGDALDataset.html#e077c53268d2272eebed10b891a05743" target="_blank">http://www.gdal.org/classGDALDataset.html#e077c53268d2272eebed10b891a05743</a><br>
<br>If you provide your source data then I could try reading it into a GDI+ bitmap object. 
<div>
<div></div>
<div class="Wj3C7c"><br>&nbsp;<br>Best regards,<br><br>Tamas<br><br><br><br>
<div class="gmail_quote">2009/1/8 Eric Domazlicky <span dir="ltr">&lt;<a href="mailto:edomazlicky@gmail.com" target="_blank">edomazlicky@gmail.com</a>&gt;</span><br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT: rgb(204,204,204) 1px solid">
<div>
<div></div>
<div>
<div class="gmail_quote">This looks like a great way to go but can anyone explain exactly what the bandmap and bandspace parameters are? I know BandMap is an array but what is it supposed to represent? I want the image data to be read and put into my destination buffer in ARGB format, the source data is in RGBA format. I tried making an array with elements in order: 4,1,2,3 but the destination data is transparent so I&#39;m thinking the alpha value isn&#39;t getting read right. <br>

<div>
<div></div>
<div><br>
<div class="gmail_quote">On Wed, Jan 7, 2009 at 4:12 PM, Tamas Szekeres <span dir="ltr">&lt;<a href="mailto:szekerest@gmail.com" target="_blank">szekerest@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: rgb(204,204,204) 1px solid">Eric,<br><br>The most performant option I&#39;m aware of is reading the dataset directly into a bitmap buffer something like:<br>
<br>try<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int stride = bitmapData.Stride;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IntPtr buf = bitmapData.Scan0;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ds.ReadRaster(xOff, yOff, width, height, buf, imageWidth, imageHeight, dataType,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; channelCount, bandMap, pixelSpace, stride, 1);<br>
}<br>finally<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bitmap.UnlockBits(bitmapData);<br>}<br><br>In this case there&#39;s no internal buffers in the marshalling code used by the C# wrappers. The only challenge here is to ensure that the bitmap buffer should have the same structure as the gdal dataset represents. You could refer to the complete example in the C# wrapper for the details:<br>
<a href="http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/GDALDatasetRasterIO.cs" target="_blank">http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/GDALDatasetRasterIO.cs</a><br><a href="http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/GDALReadDirect.cs" target="_blank">http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/GDALReadDirect.cs</a><br>
<br>I don&#39;t think if triggering multiple reads for different sections in multiple threads is currently supported by gdal, it might also be driver dependent how the reads are actually implemented by the drivers, however you might anyway try defining separate Dataset objects for the different when performing the read operations, but there might be locks in different places causing the operations to be serialized in effect.<br>
<br>Best regards,<br><br>Tamas<br><br><br><br>
<div class="gmail_quote">2009/1/8 Eric Domazlicky <span dir="ltr">&lt;<a href="mailto:edomazlicky@gmail.com" target="_blank">edomazlicky@gmail.com</a>&gt;</span><br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT: rgb(204,204,204) 1px solid">
<div>
<div>I am developing a tiling application and I was hoping to up the speed a bit by doing some multithreading. What I want to do is start each of 3 ReadRaster calls in seperate threads (using BeginInvoke delegates), then wait for them to complete and build my RGB image (using EndInvoke). I am using the C# wrapper to the GDAL library. This multithreaded approach is showing clear signs of&nbsp;race conditions, with some of the channels not appearing, random crashes etc. If I ensure each thread completes before I go on to read the next Raster Band it works fine.</div>

<div>&nbsp;</div>
<div>Is there anyway to make ReadRaster thread-safe? Maybe by disabling caching which I suspect is the problem.</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div><br></div>_______________________________________________<br>gdal-dev mailing list<br><a href="mailto:gdal-dev@lists.osgeo.org" target="_blank">gdal-dev@lists.osgeo.org</a><br><a href="http://lists.osgeo.org/mailman/listinfo/gdal-dev" target="_blank">http://lists.osgeo.org/mailman/listinfo/gdal-dev</a><br>
</blockquote></div><br></blockquote></div><br></div></div></div><br></div></div><br>_______________________________________________<br>gdal-dev mailing list<br><a href="mailto:gdal-dev@lists.osgeo.org" target="_blank">gdal-dev@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/gdal-dev" target="_blank">http://lists.osgeo.org/mailman/listinfo/gdal-dev</a><br></blockquote></div><br></div></div></blockquote></div><br>