<div dir="ltr"><div dir="ltr">You did not count the band size when allocating memory for the buffer.<div>That should be:</div><div><br></div><div>byte[] readRaster = new byte[tileSize * tileSize * 4];<br></div><div><br></div><div>Or alternatively use Band.ReadRaster to read just a specific band.</div><div><br></div><div>Best regards,</div><div><br></div><div>Tamas</div><div><br></div><div><br></div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr">Gigas002 <<a href="mailto:gigas002@yandex.ru">gigas002@yandex.ru</a>> ezt írta (időpont: 2018. nov. 12., H, 17:34):<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all.<br>
I've rewritten some python code from gdal2tiles.py on c#, using <a href="http://GDAL.NET" rel="noreferrer" target="_blank">GDAL.NET</a><br>
nuget package (ver. 2.3.1). Here you can see the working python code:<br>
<br>
def create_overview_tiles(input_file, output_file):<br>
        tile_driver = 'PNG'<br>
        tile_size = 256<br>
        tilebands = 4<br>
        resampling = 'bilinear'<br>
<br>
        mem_driver = gdal.GetDriverByName('MEM')<br>
        out_driver = gdal.GetDriverByName(tile_driver)<br>
<br>
        dsquery = mem_driver.Create('', 2 * tile_size, 2 * tile_size, tilebands)<br>
        dstile = mem_driver.Create('', tile_size, tile_size, tilebands)<br>
        dsquerytile = gdal.Open(input_file, gdal.GA_ReadOnly)<br>
<br>
        dsquery.WriteRaster(0, 0, tile_size, tile_size, dsquerytile.ReadRaster(0,<br>
0, tile_size, tile_size), band_list=list(range(1, tilebands + 1)))<br>
        scale_query_to_tile(dsquery, dstile, resampling)<br>
        out_driver.CreateCopy(output_file, dstile, strict=0)<br>
<br>
<br>
def scale_query_to_tile(dsquery, dstile, resampling):<br>
    querysize = dsquery.RasterXSize<br>
    tilesize = dstile.RasterXSize<br>
<br>
    if resampling == 'near':<br>
        gdal_resampling = gdal.GRA_NearestNeighbour<br>
<br>
    elif resampling == 'bilinear':<br>
                gdal_resampling = gdal.GRA_Bilinear<br>
<br>
    elif resampling == 'cubic':<br>
        gdal_resampling = gdal.GRA_Cubic<br>
<br>
    elif resampling == 'cubicspline':<br>
        gdal_resampling = gdal.GRA_CubicSpline<br>
<br>
    dsquery.SetGeoTransform((0.0, tilesize / float(querysize), 0.0, 0.0,<br>
0.0, tilesize / float(querysize)))<br>
    dstile.SetGeoTransform((0.0, 1.0, 0.0, 0.0, 0.0, 1.0))<br>
<br>
    gdal.ReprojectImage(dsquery, dstile, None, None, gdal_resampling)<br>
<br>
<br>
And here's rewritten code on c#:<br>
<br>
        private static void BuildOverview(string inputFile, string<br>
outputFile)<br>
        {<br>
            const string tileDriver = "PNG";<br>
            const int tileSize = 256;<br>
            const int tileBands = 4;<br>
            const string resampling = "bilinear";<br>
<br>
            Driver memDriver = Gdal.GetDriverByName("MEM");<br>
            Driver outDriver = Gdal.GetDriverByName(tileDriver);<br>
<br>
            Dataset dsQuery = memDriver.Create("", 2 * tileSize, 2 *<br>
tileSize, tileBands, DataType.GDT_Byte, null);<br>
            Dataset dsTile = memDriver.Create("", tileSize, tileSize,<br>
tileBands, DataType.GDT_Byte, null);<br>
            Dataset dsQueryTile = Gdal.Open(inputFile, Access.GA_ReadOnly);<br>
<br>
            byte[] readRaster = new byte[tileSize * tileSize];<br>
            dsQueryTile.ReadRaster(0, 0, tileSize, tileSize, readRaster,<br>
tileSize, tileSize,<br>
                tileBands, Enumerable.Range(1, tileBands + 1).ToArray(), 0,<br>
0, 0);<br>
            dsQuery.WriteRaster(0, 0, tileSize, tileSize, readRaster,<br>
tileSize, tileSize,<br>
                tileBands, Enumerable.Range(1, tileBands + 1).ToArray(), 0,<br>
0, 0);<br>
<br>
            ScaleQueryToTile(dsQuery, dsTile, resampling);<br>
            outDriver.CreateCopy(outputFile, dsTile, 0, null, null, null);<br>
        }<br>
<br>
        private static void ScaleQueryToTile(Dataset dsQuery, Dataset<br>
dsTile, string resampling)<br>
        {<br>
            int querySize = dsQuery.RasterXSize;<br>
            int tileSize = dsTile.RasterXSize;<br>
<br>
            ResampleAlg gdalResampling;<br>
            switch (resampling)<br>
            {<br>
                case "near":<br>
                    gdalResampling = ResampleAlg.GRA_NearestNeighbour;<br>
                    break;<br>
                case "bilinear":<br>
                    gdalResampling = ResampleAlg.GRA_Bilinear;<br>
                    break;<br>
                case "cubicspline":<br>
                    gdalResampling = ResampleAlg.GRA_CubicSpline;<br>
                    break;<br>
                default:<br>
                    gdalResampling = ResampleAlg.GRA_Cubic;<br>
                    break;<br>
            }<br>
<br>
            dsQuery.SetGeoTransform(new[] {0.0, tileSize / (float)<br>
querySize, 0, 0, 0, tileSize / (float) querySize});<br>
            dsTile.SetGeoTransform(new[] { 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 });<br>
<br>
            Gdal.ReprojectImage(dsQuery, dsTile, null, null, gdalResampling,<br>
0, 0, null, null, null);<br>
        }<br>
<br>
<br>
I use these methods to create upper tile (in my case create 10 lvl tile from<br>
11 lvl tile). Python version works without problem, but c#'s throws<br>
"System.AccessViolationException" (Additional information on exception from<br>
VS: Attempted to read or write protected memory. This is often an indication<br>
that other memory is corrupt) on "dsQueryTile.ReadRaster(..." line in<br>
runtime. <br>
I suppose the exception is thrown because ReadRaster try to create pointer<br>
to byte[] and somehow fails. <br>
<br>
I uploaded the 11 lvl png tile, named "z_x_y.png", and good 10 lvl tile,<br>
done by python. I'm using VS2017, Win10x64 and writing on .net framework<br>
4.7.2.<br>
Hope anyone knows how to fix it!<br>
<br>
11_2200_1621.png<br>
<<a href="http://osgeo-org.1560.x6.nabble.com/file/t384059/11_2200_1621.png" rel="noreferrer" target="_blank">http://osgeo-org.1560.x6.nabble.com/file/t384059/11_2200_1621.png</a>>  <br>
10_1100_810.png<br>
<<a href="http://osgeo-org.1560.x6.nabble.com/file/t384059/10_1100_810.png" rel="noreferrer" target="_blank">http://osgeo-org.1560.x6.nabble.com/file/t384059/10_1100_810.png</a>>  <br>
<br>
<br>
<br>
--<br>
Sent from: <a href="http://osgeo-org.1560.x6.nabble.com/GDAL-Dev-f3742093.html" rel="noreferrer" target="_blank">http://osgeo-org.1560.x6.nabble.com/GDAL-Dev-f3742093.html</a><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="https://lists.osgeo.org/mailman/listinfo/gdal-dev" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/gdal-dev</a></blockquote></div>