⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readerwritergdal.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                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 + -