tiff文件读取

tiff文件读取以下是 VC 下读取 TIFF 文件的代码 char szFileName K 地图 fujian DEM fujian1 tif TIFF tiff TIFFOpen szFileName r 打开 Tiff 文件 得到指针 以后所有的操作都通过指针进行 intnTotalFra TIFFNumberOf tiff

以下是VC下读取TIFF文件的代码

char* szFileName = "K:\\地图\\fujian-DEM\\fujian1.tif"; TIFF* tiff = TIFFOpen(szFileName, "r");//打开Tiff文件,得到指针,以后所有的操作都通过指针进行 int nTotalFrame = TIFFNumberOfDirectories(tiff); //得到图像的总帧数 //TIFFSetDirectory(tiff,0); //我们打开第一幅图,也就是第0帧,如果是第1帧,第二个参数写1,由此类推。因为Windows下图像基本 //操作都是以BMP格式进行,我们读出该帧并转成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); //每个像素占多少机器字,24位图samplesperpixel应该等于3。 TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bitspersample); //每一个机器字长,这里应为8。 uint16 bitsperpixel = bitspersample * samplesperpixel; //算出每个像素占多少bit,24位图,值为24 DWORD dwBytePerLine = (width*bitsperpixel+31)/32 *4; //由上面几个参数算出图像每行所占字节(BYTE)数。 DWORD64 dwLeng = height*dwBytePerLine;//在内存里存放这帧图像数据所需要的长度 BYTE* pData = new BYTE[dwLeng]; //为存放数据分配内存空间 uint32* raster; uint32 *row; raster = (uint32*)malloc(width * height * sizeof (uint32)); TIFFReadRGBAImage(tiff, width, height, (uint32*)pData, 1); //以上几行读出该帧数据,保存到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); //因为Tif的数据存放顺序和Windows下的BMP相反,上面这几句进行转换。 //转换结束后,数据存在pData里,释放raster所用内存。 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横向解析度,并计算出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纵向解析度,并计算出m_pInfo->bmiHeader.biYPelsPerMeter BITMAPFILEHEADER bmheader; bmheader.bfType=0x4d42; bmheader.bfSize=0; bmheader.bfReserved1=0; bmheader.bfReserved2=0; bmheader.bfOffBits=54; //这几句是生成bmp文件的头结构 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中,可以用看图软件打开浏览一下。 //记得释放内存空间 delete pInfo; pInfo = NULL; delete pData; pData = NULL; //如果想直接显示,就不需要释放,调用StretchDIBits在客户区的DC上就可以显示了。 //如果再打开其他帧的话,从TIFFSetDirectory开始循环运行,比如取下一帧就是 TIFFSetDirectory(tiff,1); //记得保存时另换一个bmp文件名。 //最后,对这个TIFF文件全部操作结束,记得调用 TIFFClose(tiff);

下面的代码是用GDAL打开的

char* szFileName = "K:\\地图\\fujian-DEM\\fujian1.tif"; GDALDataset *poDataset; //GDAL数据集 GDALAllRegister(); poDataset = (GDALDataset*)GDALOpen(szFileName,GA_ReadOnly); if( poDataset == NULL ) { AfxMessageBox(_T("文件打开失败!!!")); return; } GDALRasterBand *poBand; //遥感的一个波段 int nBandCount = poDataset->GetRasterCount(); poBand = poDataset->GetRasterBand(1); //和数组下标有点不同 //获得图像显示窗口的尺寸 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逐点显示图像 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 
  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209421.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午9:16
下一篇 2026年3月19日 上午9:17


相关推荐

  • 智谱、MiniMax冲刺港股IPO,大模型“六小龙”开启资本化征程

    智谱、MiniMax冲刺港股IPO,大模型“六小龙”开启资本化征程

    2026年3月12日
    2
  • service mesh框架对比_k8s外部访问内部service

    service mesh框架对比_k8s外部访问内部serviceservice用于4层路由负载 ingress用于7层路由负载1 Service介绍在kubernetes中,Pod是应用程序的载体,我们可以通过Pod的IP来访问应用程序,但是Pod的IP地址不是固定的,这就意味着不方便直接采用Pod的IP对服务进行访问。为了解决这个问题,kubernetes提供了Service资源,Service会对提供同一个服务的多个Pod进行聚合,并且提供一个统一的入口地址,通过访问Service的入口地址就能访问到后面的Pod服务。Service在很多情况下只是一个概念

    2022年8月9日
    5
  • Java后台登录注册管理系统

    Java后台登录注册管理系统转载请注明出处:https://blog.csdn.net/binbinqq86/article/details/81746294项目简介环境搭建ide的选择数据库相关tomcat相关开始JDBC封装DAO封装Junit编写jsp编写servlet编写运行结果写在最后项目简介本文是笔者自己学习后台开发打响的第一枪,也是后台开发最基础的了,记得刚毕业的时候做过一个web项目,一直到今天都没有再了解过这方面,如今重新拾起,感觉还是需要多了解一些后端的东西,如果一直停留在移动端和前

    2022年4月25日
    55
  • freemarker该阵列

    freemarker该阵列

    2022年1月5日
    45
  • 寻路算法——A*算法详解并附带实现代码

    寻路算法——A*算法详解并附带实现代码一 前言之前在做 rpg 游戏的时候实体移动用的是 A 算法 那时候没有去研究 A 算法原理 前天看了一篇博客介绍 A 算法 按照自己的理解记录一下 A 算法 参考 https blog csdn net nie article details https zhuanlan zhihu com p 二 应用场景一副地图中有坐标 A 和 B 需要找到一条路径 如果有的话 能从 A 到 B 地图中可能有河流或墙壁不能直接穿过 我们需要怎样找到这条路

    2026年3月19日
    2
  • sqrt函数用法c语言 linux,C语言中sqrt函数如何使用

    sqrt函数用法c语言 linux,C语言中sqrt函数如何使用C语言中sqrt函数如何使用发布时间:2020-04-3010:08:20来源:亿速云阅读:370作者:小新C语言中sqrt函数如何使用?相信有很多人都不太了解,今天小编为了让大家更加了解sqrt函数,所以给大家总结了以下内容,一起往下看吧。c语言sqrt函数的用法sqrt函数用于计算一个非负实数的平方根。sqrt的函数原型:在VC6.0中的math.h头文件的函数原型为doublesqrt…

    2022年5月1日
    211

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号