日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

tiff或tif文件的读取

發(fā)布時(shí)間:2023/12/13 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 tiff或tif文件的读取 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以下是VC下讀取TIFF文件的代碼

char* szFileName = "K:\地圖\fujian-DEM\fujian1.tif";
    TIFF* tiff = TIFFOpen(szFileName, "r");//打開Tiff文件,得到指針,以后所有的操作都通過(guò)指針進(jìn)行

    int nTotalFrame = TIFFNumberOfDirectories(tiff);    //得到圖像的總幀數(shù)

    //TIFFSetDirectory(tiff,0);
    //我們打開第一幅圖,也就是第0幀,如果是第1幀,第二個(gè)參數(shù)寫1,由此類推。因?yàn)閃indows下圖像基本
    //操作都是以BMP格式進(jìn)行,我們讀出該幀并轉(zhuǎn)成BMP格式。

    char *dtitle;
    TIFFGetField(tiff,TIFFTAG_PAGENAME,&dtitle);
    //得到該幀的名字,存放在dtitle中。

    int width,height;
    TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &width);  //得到寬度
    TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &height);//得到高度

    float resolution = max(width,height);

    uint16 bitspersample = 1;
    uint16 samplesperpixel = 1;

    TIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);
    //每個(gè)像素占多少機(jī)器字,24位圖samplesperpixel應(yīng)該等于3。
    TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bitspersample);
    //每一個(gè)機(jī)器字長(zhǎng),這里應(yīng)為8。

    uint16 bitsperpixel = bitspersample * samplesperpixel;
    //算出每個(gè)像素占多少bit,24位圖,值為24
    DWORD dwBytePerLine = (width*bitsperpixel+31)/32 *4;
    //由上面幾個(gè)參數(shù)算出圖像每行所占字節(jié)(BYTE)數(shù)。


    DWORD64 dwLeng = height*dwBytePerLine;//在內(nèi)存里存放這幀圖像數(shù)據(jù)所需要的長(zhǎng)度
    BYTE* pData = new BYTE[dwLeng];    //為存放數(shù)據(jù)分配內(nèi)存空間


    uint32* raster;        
    uint32 *row;
    raster = (uint32*)malloc(width * height * sizeof (uint32));
    TIFFReadRGBAImage(tiff, width, height, (uint32*)pData, 1); 
    //以上幾行讀出該幀數(shù)據(jù),保存到raster中。

    row = &raster[0];
    LPBYTE bits2 = pData;
    for (int y = 0; y < height; y++) 
    {

        LPBYTE bits = bits2;
        for (int x = 0; x < width; x++) 
        {
            *bits++ = (BYTE)TIFFGetB(row[x]);
            *bits++ = (BYTE)TIFFGetG(row[x]);
            *bits++ = (BYTE)TIFFGetR(row[x]);
        }
        row += width;
        bits2 += dwBytePerLine;
    }
    _TIFFfree(raster);

    //因?yàn)門if的數(shù)據(jù)存放順序和Windows下的BMP相反,上面這幾句進(jìn)行轉(zhuǎn)換。
    //轉(zhuǎn)換結(jié)束后,數(shù)據(jù)存在pData里,釋放raster所用內(nèi)存。



    LPBITMAPINFO pInfo = new BITMAPINFO;
    pInfo->bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);
    pInfo->bmiHeader.biWidth        = width;
    pInfo->bmiHeader.biHeight        = width;
    pInfo->bmiHeader.biCompression    = BI_RGB;

    pInfo->bmiHeader.biClrUsed        = 0;
    pInfo->bmiHeader.biClrImportant    = 0;
    pInfo->bmiHeader.biPlanes        = 1;
    pInfo->bmiHeader.biBitCount = 24;
    pInfo->bmiHeader.biSizeImage        = dwLeng;

    float xres,yres;
    uint16 res_unit; 
    //解析度單位:如是英寸,厘米
    TIFFGetFieldDefaulted(tiff, TIFFTAG_RESOLUTIONUNIT, &res_unit);

    if(TIFFGetField(tiff, TIFFTAG_XRESOLUTION, &xres) == 0)
    {
        pInfo->bmiHeader.biXPelsPerMeter = 0;
    }
    else
    {
        if(res_unit == 2)    //英寸
        {
            pInfo->bmiHeader.biXPelsPerMeter = xres * 10000 / 254;
        }
        else if(res_unit == 3)    //厘米
        {
            pInfo->bmiHeader.biXPelsPerMeter = xres * 100;
        }
        else
        {
            pInfo->bmiHeader.biXPelsPerMeter = 0;
        }
    }
    //得到該幀TIFF橫向解析度,并計(jì)算出m_pInfo->bmiHeader.biXPelsPerMeter

    if(TIFFGetField(tiff, TIFFTAG_YRESOLUTION, &yres) == 0)
    {
        pInfo->bmiHeader.biYPelsPerMeter = 0;
    }
    else
    {
        if(res_unit == 2)    //英寸
        {
            pInfo->bmiHeader.biYPelsPerMeter = yres * 10000 / 254;
        }
        else if(res_unit == 3)    //厘米
        {
            pInfo->bmiHeader.biYPelsPerMeter = yres * 100;
        }
        else
        {
            pInfo->bmiHeader.biYPelsPerMeter = 0;
        }
    }
    //得到該幀TIFF縱向解析度,并計(jì)算出m_pInfo->bmiHeader.biYPelsPerMeter


    BITMAPFILEHEADER bmheader;
    bmheader.bfType=0x4d42;
    bmheader.bfSize=0;
    bmheader.bfReserved1=0;
    bmheader.bfReserved2=0;
    bmheader.bfOffBits=54;
    //這幾句是生成bmp文件的頭結(jié)構(gòu)

    CFile bmpFile;
    bmpFile.Open(_T("c://test.bmp"),CFile::modeCreate|CFile::modeWrite);
    bmpFile.Write(&bmheader,sizeof(BITMAPFILEHEADER));
    bmpFile.Write(&(pInfo->bmiHeader),sizeof(BITMAPINFOHEADER));
    bmpFile.Write(pData,dwLeng);
    bmpFile.Close();

    //這里,把該幀TIFF保存到了C盤的test.bmp中,可以用看圖軟件打開瀏覽一下。

    //記得釋放內(nèi)存空間
    delete pInfo;
    pInfo = NULL;
    delete pData;
    pData = NULL;
    //如果想直接顯示,就不需要釋放,調(diào)用StretchDIBits在客戶區(qū)的DC上就可以顯示了。


    //如果再打開其他幀的話,從TIFFSetDirectory開始循環(huán)運(yùn)行,比如取下一幀就是
    TIFFSetDirectory(tiff,1);
    //記得保存時(shí)另?yè)Q一個(gè)bmp文件名。
    //最后,對(duì)這個(gè)TIFF文件全部操作結(jié)束,記得調(diào)用
    TIFFClose(tiff);

下面的代碼是用GDAL打開的

char* szFileName = "K:\地圖\fujian-DEM\fujian1.tif";
    GDALDataset *poDataset;   //GDAL數(shù)據(jù)集
    GDALAllRegister();

    poDataset = (GDALDataset*)GDALOpen(szFileName,GA_ReadOnly);
    if( poDataset == NULL )
    {
        AfxMessageBox(_T("文件打開失敗!!!"));
        return;
    } 

    GDALRasterBand *poBand;   //遙感的一個(gè)波段
    int nBandCount = poDataset->GetRasterCount();
    poBand = poDataset->GetRasterBand(1);   //和數(shù)組下標(biāo)有點(diǎn)不同

    //獲得圖像顯示窗口的尺寸
    GetClientRect(&m_ViewRect);

    int nImgSizeX = poDataset->GetRasterXSize();
    int nImgSizeY = poDataset->GetRasterYSize();

    double adfGeoTransform[6];
    poDataset->GetGeoTransform( adfGeoTransform );

    double right  = adfGeoTransform[0] + nImgSizeX*adfGeoTransform[1];
    double bottom  = adfGeoTransform[3] + nImgSizeY*adfGeoTransform[5];

    int nBufferSizeX,nBufferSizeY;

    nBufferSizeX = nImgSizeX;
    nBufferSizeY = nImgSizeY;

    int nScrrenWidth = m_ViewRect.Width();
    int nScrrenHeight= m_ViewRect.Height();

    BYTE *pafScanblock1,*TempLock1;
    pafScanblock1 = (BYTE *) CPLMalloc((nScrrenWidth)*(nScrrenHeight));
    TempLock1 = pafScanblock1;

    poBand->RasterIO( GF_Read, 0, 0,nBufferSizeX,nBufferSizeY, 
        pafScanblock1,nScrrenWidth,nScrrenHeight, GDT_Byte,0, 0 );

    //在View逐點(diǎn)顯示圖像
    DWORD dwBytes = (nScrrenWidth * 24) / 8;
    while(((DWORD) dwBytes) % 4) 
    {
        dwBytes++;
    }

    BYTE *szBuffer = new BYTE[nScrrenHeight*dwBytes];
    memset(szBuffer,0,nScrrenHeight*dwBytes);
    BYTE *pTemp = szBuffer;
    CClientDC dc(this);
    int nIndex = 0;
    for (int i=0;i<nScrrenHeight;i++)
    {
        for (int j=0;j<nScrrenWidth;j++)
        {

            BYTE dn1 = *pafScanblock1;

            memcpy(szBuffer,(char*)(&dn1),1);
            szBuffer += 1;

            pafScanblock1 ++;

        }

        szBuffer = pTemp+dwBytes*i;

    }
    CPLFree(TempLock1);

    BITMAPINFOHEADER bmiHdr;
    BITMAPINFO MapInfo;
    memset(&bmiHdr, 0, sizeof(BITMAPINFOHEADER));
    bmiHdr.biBitCount = 3*8;
    bmiHdr.biClrImportant = 0;
    bmiHdr.biClrUsed = 0;
    bmiHdr.biCompression = BI_RGB;
    bmiHdr.biHeight = -nScrrenHeight;
    bmiHdr.biPlanes = 1;
    bmiHdr.biSize = sizeof(BITMAPINFOHEADER);
    bmiHdr.biSizeImage = 0;
    bmiHdr.biWidth = nScrrenWidth;

    bmiHdr.biXPelsPerMeter = 0;
    bmiHdr.biYPelsPerMeter = 0;

    MapInfo.bmiHeader = bmiHdr;
    MapInfo.bmiColors[0].rgbBlue = 0;
    MapInfo.bmiColors[0].rgbGreen = 0;
    MapInfo.bmiColors[0].rgbRed = 0;
    MapInfo.bmiColors[0].rgbReserved = 0;

    dc.SetStretchBltMode(MAXSTRETCHBLTMODE);
    ::StretchDIBits(dc.GetSafeHdc(), 0, 0, nScrrenWidth, nScrrenHeight,
        0, 0, bmiHdr.biWidth, -bmiHdr.biHeight,
        pTemp, (LPBITMAPINFO)(&MapInfo), DIB_RGB_COLORS, SRCCOPY);

    GDALClose(poDataset);
    delete []pTemp;

原文鏈接:tiff文件讀取

總結(jié)

以上是生活随笔為你收集整理的tiff或tif文件的读取的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。