tiff文件读取

2023-05-16

以下是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<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;



 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tiff文件读取 的相关文章

  • 【h5文件读取】h5文件读取——深度学习数据集常用

    数据集的常用格式 xff1a h5 深度学习搞了很长时间 xff0c 其中开源的代码中经常用到大型数据集 xff0c 里面的数据类型是h5格式 xff0c 这个格式困扰我挺长时间 xff0c 因为隔离还拿不到实验室的程序 xff0c 只好硬
  • ImageMagick 或 GhostScript:将多页 TIFF 转换为多页 PDF

    我需要将多页 TIFF 转换为多页 PDF 我可以访问 ImageMagick 和 GhostScript 在 nix 环境中 我该怎么做呢 谢谢 UPDATE 事实证明我的测试文件是错误的 它没有多个页面 这让我认为我的命令是错误的 这似
  • 需要 C# 函数将灰度 TIFF 转换为黑白(单色/1BPP)TIFF

    我需要一个 C 函数 它将获取 8 位灰度 TIFF 的 Byte 并返回 1 位 黑白 TIFF 的 Byte 我对使用 TIFF 相当陌生 但总体思路是我们需要将它们从灰度或彩色转换为黑白 单色 二进制图像格式 我们通过 WCF 以 B
  • .NET TIFF 文件:无需第三方库即可将 RGB 转换为 CMYK?

    继续我之前的问题 是否以及如何可以基于 RGBTIFF文件并使用标准 NET 3 5 功能将其转换为 CMYK 这可能吗 实际上有一种方法使用 System Windows Media Imaging 命名空间 目前似乎只适用于 TIFF
  • JAI:如何从多页 TIFF 图像容器中提取单页输入流?

    我有一个将 PDF 文档转换为图像的组件 每页一张图像 由于该组件使用转换器生成内存中图像 因此它会对 JVM 堆造成严重影响 并且需要一些时间才能完成转换 我正在尝试提高转换过程的整体性能 并找到了一个具有 JNI 绑定的本机库来将 PD
  • c# 如何使用 iTextsharp 从 pdf 返回字节数组

    All 我创建了以下方法来接收具有多个 tiff 页面文档的 tiff 字节数组 我需要将其转换为pdf 然后返回pdf字节数组 我对这段代码有两个问题1 我想返回一个字节 2 生成的 pdf 重复页面 public void conver
  • 保存带有透明度/Alpha 通道的 TIFF

    这是我的问题 我需要创建一个 TIFF 和一个 PNG 其中调色板包含特定颜色和 Alpha 我实际上能够处理 PNG 但不能处理 TIFF 我在互联网上搜索并发现 TIFF 应该处理透明度 但并非所有软件都可以 我尝试了很多方法来加载 T
  • 用 Java 读取和写入 TIFF 图像

    我尝试了以下代码来完成读取和写入 tiff 图像的任务 Define the source and destination file names String inputFile images FarmHouse tif String ou
  • 使用 System.Drawing 编辑多页 TIFF 图像

    我试图通过从图像创建图形来编辑多页 tiff 但遇到了错误消息 无法从具有索引像素格式的图像创建 Graphics 对象 如何编辑多页 tiff 我写了一些东西来从多页 tiff 文件中提取单页 Load as Bitmap using B
  • Python Wand 将 tiff 更改为 min-is-white

    我需要将文件转换为 tiff 其中光度设置为 min is white 白色为零 以符合所需的标准 我正在使用 Wand 与 Photomagick 交互 但每次保存双层 tiff 文件时 它都会创建一个 min is black 我怎样才
  • 读取 tiff 文件的尺寸和分辨率而不先加载它

    如何使用如下代码读取 tiff 文件的尺寸 宽度和高度 和分辨率 水平和垂直 而无需先将其加载到内存中 对于大文件来说太慢了 而且我不需要操作它们 Image tif Image FromFile C large size tif floa
  • 如何在 Android 设备上的 Flutter 应用程序中显示 TIFF 图像?

    我们的应用程序允许用户建立各种类型的资源库 例如 PDF 电子表格等 我们存储在 S3 上的几乎任何 MIME 类型的文档 当用户点击查看任何这些资源时 我们基本上可以确定我们使用的是 iOS 设备还是 Android 设备 在 iOS 上
  • 在 Javascript 中查看多页 TIFF

    我目前有多页TIFF图像 我需要通过 Javascript 逐页浏览它们 我对此一无所知 你能帮助我吗 我发现了一些其他问题 但似乎没有一个与 Javascript 有关 谢谢 我使用 Emscripten 将 LibTIFF 库移植到 J
  • 将两个单通道 TIFF 堆栈合并为一个多通道堆栈

    我有两个 tiff 堆栈 其中包含与显微镜实验中获取的不同通道相对应的延时数据 我想将它们合并到具有两个通道的单个堆栈中 两个堆栈都是 16 位灰度 当我使用时 convert stack1 tiff stack2 tiff stack m
  • 如何在 iPhone 中显示 .tiff 图像?

    我想在我的本机 iphone 应用程序中显示来自服务器的 tiff 图像 是否可以在本机 iPhone 应用程序中显示 tiff 图像 我花了 2 个小时试图解决这个问题 但没有成功 我在网上搜索了近2个小时 没有解决这个问题 谁能帮我解决
  • MATLAB 写入多页 tiff 指数慢

    我正在尝试编写一个多页 tiff 文件 该文件是 128 像素 x 128 像素 x 122000 帧的 16 位无符号整数 ImageJ 或简短的 Python 脚本可以在快速机器上在一分钟内完成此操作 在同一台机器上 无论使用我尝试过的
  • 将 TIFF 转换为 1 位

    我编写了一个桌面应用程序 可将 8 位 TIFF 转换为 1 位 但输出文件无法在 Photoshop 或其他图形软件 中打开 该应用程序的作用是 它对原始图像的每 8 个字节 每个像素 1 个字节 进行迭代 然后将每个值转换为 bool
  • 将 pdf 文件转换为 tiff 文件的最佳方法 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C# 中快速加载/读取 TIFF 文件

    我正在编写一个处理 TIFF 图像的 C 应用程序 主要是显示文件 重新排序页面 删除页面 分割多页图像 将单个图像合并为一个多页图像等 我们处理的大多数图像都较小 无论是文件大小还是页码 但也有一些较大的图像 显示图像时 我们需要将多页
  • Tiff 的 getImageWritersByFormatName 中存在问题。获取图像作家

    我正在尝试将 PDF 转换为 tiff 图像 我使用以下代码按格式获取图像编写器 Iterator

随机推荐

  • 2020-10-20 学习日志(Crazepony控制环)

    2020年10月20日 学习任务 xff1a 完成Crazepony控制环的理解 之前是通过姿态解算获得了 四元数 旋转矩阵 欧拉角 CtrlAttiRate void CtrlAttiRate void float yawRateTarg
  • STL学习笔记之迭代器--iterator

    STL设计的精髓在于 xff0c 把容器 xff08 Containers xff09 和算法 xff08 Algorithms xff09 分开 xff0c 彼此独立设计 xff0c 最后再用迭代器 xff08 Iterator xff0
  • 提升工作效率之PCB设计软件“立创EDA”

    文章目录 前言一 立创EDA二 PCB生产三 团队功能总结 前言 由于工作需要设计一款硬件调试小工具 xff0c 考虑到器件采购和PCB制版都在立创商城上进行 xff0c 索性就试用立创EDA进行PCB设计 结论在前 xff1a 立创线上E
  • nvidia显卡,驱动以及cuda版本对应查询

    实验室新买了一块rtx 2080和titan rtx xff0c 需要分别配置驱动和cuda xff0c 但是一直也找不到显卡和cuda的官方对照表 xff0c 每次都是百度 谷歌 必应 xff0c 参考别人安装之旅 今天突然发现了驱动和c
  • LoRa 信噪比和接收灵敏度

    文章目录 前言一 信噪比极限 xff08 SNR LIMIT xff09 二 接收灵敏度 前言 介绍信噪比极限和如何计算接收灵敏度 参考资料 xff1a LoRa信噪比和接收灵敏度 一 信噪比极限 xff08 SNR LIMIT xff09
  • C在字符串后面加/0和0

    使用复制字符串时 xff0c 经常会遇到字符串后面跟着一大堆莫名其妙的字符串 xff0c 例如屯屯屯 之类的东西 xff0c 这是因为在使用字符串时没有在字符串结尾加 0或0 通常分配一块内存到堆上或栈上时 xff0c 内存区域可能会有之前
  • 基于k8s+prometheus实现双vip可监控Web高可用集群

    目录 一 规划整个项目的拓扑结构和项目的思维导图 二 修改好各个主机的主机名 xff0c 并配置好每台机器的ip地址 网关和dns等 2 1修改每个主机的ip地址和主机名 2 2 关闭firewalld和selinux 三 使用k8s实现W
  • PX4源码开发人员文档(一)——软件架构

    软件架构 PX4 在广播消息网络内 xff0c 按照一组节点 xff08 nodes xff09 的形式进行组织 xff0c 网络之间使用像如 姿态 和 位置 之类的语义通道来传递系统状态 软件的堆栈结构主要分为四层 应用程序接口 提供给a
  • ardupilot线程理解

    对于apm和pixhawk一直存在疑惑 xff0c 到现在还不是特别清楚 今天在http dev ardupilot com 看到下面的说明 xff0c 感觉很有用 xff0c 对于整体理解amp代码很有帮助 xff0c 所以记下来 转载请
  • Pixhawk源码笔记三:串行接口UART和Console

    这里 xff0c 我们对 APM UART Console 接口进行讲解 如有问题 xff0c 可以交流30175224 64 qq com 新浪 64 WalkAnt xff0c 转载本博客文章 xff0c 请注明出处 xff0c 以便更
  • C/C++中二维数组和指针关系分析

    在C c 43 43 中 xff0c 数组和指针有着密切的关系 xff0c 有很多地方说数组就是指针式错误的一种说法 这两者是不同的数据结构 其实 xff0c 在C c 43 43 中没有所谓的二维数组 xff0c 书面表达就是数组的数组
  • 四叉树空间索引原理及其实现

    今天依然在放假中 xff0c 在此将以前在学校写的四叉树的东西拿出来和大家分享 四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构 它将已知范围的空间等分成四个相等的子空间 xff0c 如此递归下去 xff0c 直至树的层次达到一定
  • DirectXShaderCompiler mac编译

    Directxshader compiler mac编译 1 前置条件 Please make sure you have the following resources before building GitPython Version
  • intel -tbb 源码cmake构建

    cmake minimum required VERSION 3 0 0 FATAL ERROR set CMAKE CXX STANDARD 17 project tbb CXX add library tbb SHARED void c
  • 如何修改数据库密码

    多可文档管理系统是自带数据库的 xff0c 就是你在安装多可文档管理系统的同时 xff0c 数据库就已经自动安装上了 这个数据库有个默认密码 xff0c 为了数据库里的数据安全 xff0c 建议你安装完多可后 xff0c 就立刻修改数据库的
  • iOS编译openmp

    1 下载openmp源码 https github com llvm llvm project releases download llvmorg 14 0 6 openmp 14 0 6 src tar xz 2 下载ios toolch
  • 我的2013-从GIS学生到GIS职业人的飞跃

    我的 2013 从 GIS 学生GIS 职业人的飞跃 前言 xff1a 从末日中度过了 2012 年 xff0c 我们伟大的人类把这个世界末日的谎言给揭穿了 xff0c 但是不知不觉中 xff0c 2013 年又即将悄悄从我们身边溜走 xf
  • 矩阵的特征值和特征向量的雅克比算法C/C++实现

    矩阵的特征值和特征向量是线性代数以及矩阵论中非常重要的一个概念 在遥感领域也是经常用到 xff0c 比如多光谱以及高光谱图像的主成分分析要求解波段间协方差矩阵或者相关系数矩阵的特征值和特征向量 根据普通线性代数中的概念 xff0c 特征值和
  • windows多线程详解

    在一个牛人的博客上看到了这篇文章 xff0c 所以就转过来了 xff0c 地址是http blog csdn net morewindows article details 7421759 本文将带领你与多线程作第一次亲密接触 xff0c
  • tiff文件读取

    以下是VC下读取TIFF文件的代码 char szFileName 61 34 K 地图 fujian DEM fujian1 tif 34 TIFF tiff 61 TIFFOpen szFileName 34 r 34 打开Tiff文件