📄 readerwritergdal.cpp
字号:
bool bandNotHandled = true; if (ecwLoad) { bandNotHandled = false; switch (b) { case 1: bandRed = band; break; case 2: bandGreen = band; break; case 3: bandBlue = band; break; default: bandNotHandled = true; } } if (bandNotHandled) { if (band->GetColorInterpretation()==GCI_GrayIndex) bandGray = band; else if (band->GetColorInterpretation()==GCI_RedBand) bandRed = band; else if (band->GetColorInterpretation()==GCI_GreenBand) bandGreen = band; else if (band->GetColorInterpretation()==GCI_BlueBand) bandBlue = band; else if (band->GetColorInterpretation()==GCI_AlphaBand) bandAlpha = band; else if (band->GetColorInterpretation()==GCI_PaletteIndex) bandPalette = band; else bandGray = band; } if (bandPalette) { osg::notify(osg::INFO) << " Palette Interpretation: " << GDALGetPaletteInterpretationName(band->GetColorTable()->GetPaletteInterpretation()) << std::endl; } // int gotMin,gotMax;// double minmax[2];// // minmax[0] = band->GetMinimum(&gotMin);// minmax[1] = band->GetMaximum(&gotMax);// if (!(gotMin && gotMax))// {// osg::notify(osg::INFO)<<" computing min max"<<std::endl;// GDALComputeRasterMinMax(band,TRUE,minmax);// }// // osg::notify(osg::INFO) << " min "<<minmax[0]<<std::endl;// osg::notify(osg::INFO) << " max "<<minmax[1]<<std::endl; if (dataType==0) { targetGDALType = band->GetRasterDataType(); switch(band->GetRasterDataType()) { case(GDT_Byte): dataType = GL_UNSIGNED_BYTE; numBytesPerPixel = 1; break; case(GDT_UInt16): dataType = GL_UNSIGNED_SHORT; numBytesPerPixel = 2; break; case(GDT_Int16): dataType = GL_SHORT; numBytesPerPixel = 2; break; case(GDT_UInt32): dataType = GL_UNSIGNED_INT; numBytesPerPixel = 4; break; case(GDT_Int32): dataType = GL_INT; numBytesPerPixel = 4; break; case(GDT_Float32): dataType = GL_FLOAT; numBytesPerPixel = 4; break; case(GDT_Float64): dataType = GL_DOUBLE; numBytesPerPixel = 8; break; // not handled default: dataType = 0; numBytesPerPixel = 0; break; // not handled } } } int s = destWidth; int t = destHeight; int r = 1; if (dataType==0) { dataType = GL_UNSIGNED_BYTE; numBytesPerPixel = 1; targetGDALType = GDT_Byte; } unsigned char* imageData = 0; if (bandRed && bandGreen && bandBlue) { if (bandAlpha) { // RGBA int pixelSpace=4*numBytesPerPixel; int lineSpace=destWidth * pixelSpace; imageData = new unsigned char[destWidth * destHeight * pixelSpace]; pixelFormat = GL_RGBA; internalFormat = GL_RGBA; osg::notify(osg::INFO) << "reading RGBA"<<std::endl; bandRed->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(imageData+0),destWidth,destHeight,targetGDALType,pixelSpace,lineSpace); bandGreen->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(imageData+1),destWidth,destHeight,targetGDALType,pixelSpace,lineSpace); bandBlue->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(imageData+2),destWidth,destHeight,targetGDALType,pixelSpace,lineSpace); bandAlpha->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(imageData+3),destWidth,destHeight,targetGDALType,pixelSpace,lineSpace); } else { // RGB int pixelSpace=3*numBytesPerPixel; int lineSpace=destWidth * pixelSpace; imageData = new unsigned char[destWidth * destHeight * pixelSpace]; pixelFormat = GL_RGB; internalFormat = GL_RGB; osg::notify(osg::INFO) << "reading RGB"<<std::endl; bandRed->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(imageData+0),destWidth,destHeight,targetGDALType,pixelSpace,lineSpace); bandGreen->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(imageData+1),destWidth,destHeight,targetGDALType,pixelSpace,lineSpace); bandBlue->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(imageData+2),destWidth,destHeight,targetGDALType,pixelSpace,lineSpace); } } else if (bandGray) { if (bandAlpha) { // Luminance alpha int pixelSpace=2*numBytesPerPixel; int lineSpace=destWidth * pixelSpace; imageData = new unsigned char[destWidth * destHeight * pixelSpace]; pixelFormat = GL_LUMINANCE_ALPHA; internalFormat = GL_LUMINANCE_ALPHA; osg::notify(osg::INFO) << "reading grey + alpha"<<std::endl; bandGray->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(imageData+0),destWidth,destHeight,targetGDALType,pixelSpace,lineSpace); bandAlpha->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(imageData+1),destWidth,destHeight,targetGDALType,pixelSpace,lineSpace); } else { // Luminance map int pixelSpace=1*numBytesPerPixel; int lineSpace=destWidth * pixelSpace; imageData = new unsigned char[destWidth * destHeight * pixelSpace]; pixelFormat = GL_LUMINANCE; internalFormat = GL_LUMINANCE; osg::notify(osg::INFO) << "reading grey"<<std::endl; bandGray->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(imageData+0),destWidth,destHeight,targetGDALType,pixelSpace,lineSpace); } } else if (bandAlpha) { // alpha map int pixelSpace=1*numBytesPerPixel; int lineSpace=destWidth * pixelSpace; imageData = new unsigned char[destWidth * destHeight * pixelSpace]; pixelFormat = GL_ALPHA; internalFormat = GL_ALPHA; osg::notify(osg::INFO) << "reading alpha"<<std::endl; bandAlpha->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(imageData+0),destWidth,destHeight,targetGDALType,pixelSpace,lineSpace); } else if (bandPalette) { // Paletted map int pixelSpace=1*numBytesPerPixel; int lineSpace=destWidth * pixelSpace; unsigned char *rawImageData; rawImageData = new unsigned char[destWidth * destHeight * pixelSpace]; imageData = new unsigned char[destWidth * destHeight * 4/*RGBA*/]; pixelFormat = GL_RGBA; internalFormat = GL_RGBA; osg::notify(osg::INFO) << "reading palette"<<std::endl; osg::notify(osg::INFO) << "numBytesPerPixel: " << numBytesPerPixel << std::endl; bandPalette->RasterIO(GF_Read,windowX,windowY,windowWidth,windowHeight,(void*)(rawImageData),destWidth,destHeight,targetGDALType,pixelSpace,lineSpace); // Map the indexes to an actual RGBA Value. for (int i = 0; i < destWidth * destHeight; i++) { const GDALColorEntry *colorEntry = bandPalette->GetColorTable()->GetColorEntry(rawImageData[i]); GDALPaletteInterp interp = bandPalette->GetColorTable()->GetPaletteInterpretation(); if (!colorEntry) { //FIXME: What to do here? //osg::notify(osg::INFO) << "NO COLOR ENTRY FOR COLOR " << rawImageData[i] << std::endl; imageData[4*i+0] = 255; imageData[4*i+1] = 0; imageData[4*i+2] = 0; imageData[4*i+3] = 1; } else { if (interp == GPI_RGB) { imageData[4*i+0] = colorEntry->c1; imageData[4*i+1] = colorEntry->c2; imageData[4*i+2] = colorEntry->c3; imageData[4*i+3] = colorEntry->c4; } else if (interp == GPI_CMYK) { // from wikipedia.org short C = colorEntry->c1; short M = colorEntry->c2; short Y = colorEntry->c3; short K = colorEntry->c4; imageData[4*i+0] = 255 - C*(255 - K) - K; imageData[4*i+1] = 255 - M*(255 - K) - K; imageData[4*i+2] = 255 - Y*(255 - K) - K; imageData[4*i+3] = 255; } else if (interp == GPI_HLS) { // from easyrgb.com float H = colorEntry->c1; float S = colorEntry->c3; float L = colorEntry->c2; float R, G, B; if ( S == 0 ) //HSL values = 0 - 1 { R = L; //RGB results = 0 - 1 G = L; B = L; } else { float var_2, var_1; if ( L < 0.5 ) var_2 = L * ( 1 + S ); else var_2 = ( L + S ) - ( S * L ); var_1 = 2 * L - var_2; R = Hue_2_RGB( var_1, var_2, H + ( 1 / 3 ) ); G = Hue_2_RGB( var_1, var_2, H ); B = Hue_2_RGB( var_1, var_2, H - ( 1 / 3 ) ); } imageData[4*i+0] = static_cast<unsigned char>(R*255.0f); imageData[4*i+1] = static_cast<unsigned char>(G*255.0f); imageData[4*i+2] = static_cast<unsigned char>(B*255.0f); imageData[4*i+3] = static_cast<unsigned char>(255.0f); } else if (interp == GPI_Gray) { imageData[4*i+0] = static_cast<unsigned char>(colorEntry->c1*255.0f); imageData[4*i+1] = static_cast<unsigned char>(colorEntry->c1*255.0f); imageData[4*i+2] = static_cast<unsigned char>(colorEntry->c1*255.0f); imageData[4*i+3] = static_cast<unsigned char>(255.0f); } } } delete [] rawImageData; } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -