Hi David,

I have tested both solutions.
They work but finally I use another to improve performances.
I read the entire dataset with RasterIO and I reverse it when I display it with 
StretchDIBits function.

Best regards


De : David Strip [mailto:[email protected]]
Envoyé : samedi 31 août 2013 20:12
À : Ismael BELAAOUAD
Objet : Re: [gdal-dev] TR: Load GDALDataset Into DIB

glad to be of help.
Just curious -
did you read one scan line at a time, or did you read the whole array and 
reverse it?

(And your English is great - far better than my French.)

On 8/31/2013 11:50 AM, Ismael BELAAOUAD wrote:
Hi David,
Thank you for your response.
It's working!
Best regards

De : David Strip [mailto:[email protected]]
Envoyé : samedi 31 août 2013 04:51
À : Ismael BELAAOUAD
Objet : Re: [gdal-dev] TR: Load GDALDataset Into DIB

In your code you write:




               else

               {

                       for ( int iBand = 1 ,nBandsRead = 0 ; iBand <= nBands ; 
iBand ++ )

                       {

                               int iColorOffset;

                               switch( 
poDataset->GetRasterBand(iBand)->GetColorInterpretation() )

                               {

                                              // BGR

                                      case GCI_RedBand :

                                              iColorOffset = 2;

                                              break;

                                      case GCI_GreenBand :

                                              iColorOffset = 1;

                                              break;

                                      case GCI_BlueBand :

                                              iColorOffset = 0;

                                              break;

                                      default :

                                              continue ;

                               }

                               gdErr = 
poDataset->GetRasterBand(iBand)->RasterIO(

                                           GF_Read , 0 ,0 , 
poDataset->GetRasterXSize(), poDataset->GetRasterYSize(),

                                           ((LPBYTE)pBits) + iColorOffset 
,bmi.Header.biWidth,bmi.Header.biHeight,

                                           GDT_Byte, 3, nScanSize );

                               nBandsRead ++;

                       }



The key is the GetRasterBand call. By passing in poDataset->GetRasterYSize(), 
you are asking to read all the rows of the raster. If you look at the example 
in the GDAL tutorial<http://www.gdal.org/gdal_tutorial.html>, only one scan 
line at a time is being read -



        float *pafScanline;

        int   nXSize = 
poBand->GetXSize<http://www.gdal.org/classGDALRasterBand.html#a46f78e79da622039a670107ae5a94f02>();



        pafScanline = (float *) CPLMalloc(sizeof(float)*nXSize);

        
poBand->RasterIO<http://www.gdal.org/classGDALRasterBand.html#a5497e8d29e743ee9177202cb3f61c3c7>(
 
GF_Read<http://www.gdal.org/gdal_8h.html#ae602fdf251b6b0210a5af5a7cf7623b3ab2abfe1fa6e34018b8c692eb48f35cb5>,
 0, 0, nXSize, 1,

                          pafScanline, nXSize, 1, 
GDT_Float32<http://www.gdal.org/gdal_8h.html#a22e22ce0a55036a96f652765793fb7a4af5cbd2f96abffd9ac061fc0dced5cbba>,

                          0, 0 );


In order to read the data in reverse order, you need to read one scan line at a 
time. Start with the last scan line, read it into the DIB array (pBits), then 
increment pBits by the size of the scan line, and read the next scan line.

Perhaps a simpler way at the expense of using more memory, is to read the array 
just as you are doing, then allocate a new array and copy the original array in 
reverse order. You then need to associate the second (reversed) array with your 
bitmap.

Hope this helps.













_______________________________________________
gdal-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to