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文件读取 的相关文章

  • Newtonsoft.Json使用,C# Json文件读取,写入

    用学校作为例子 xff0c 有学校名称 xff0c 学校下面有班级 xff0c 班级有名字 xff0c 班级下面有学生 xff0c 这里面有数组 xff0c 有字段 using System using System Collections
  • CSV文件读取 C++版本

    代码 span class token comment 创建结构体 xff0c 把读取数据可以放入结构体成员中 span span class token keyword struct span span class token class
  • VUE中如何将tiff图片显示在浏览器中

    VUE中如何将tiff图片显示在浏览器中 下载tiff js 在index中引入 mounted 调用方法 this loadImage static pictif tif methods loadImage filename var xh
  • 如何在 Silverlight 上显示 tiff 文件?

    如何在 Silverlight 应用程序上显示 tiff 文件 我可以显示除 tiff 之外的任何图像格式 有人可以帮助我吗 谢谢 我成功地在 Silverlight 中显示 TIFF 免费移植很容易LibTiff NET库到 Silver
  • 需要 C# 函数将灰度 TIFF 转换为黑白(单色/1BPP)TIFF

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

    有没有办法将 HTML 字符串转换为 Image tiff 文件 我正在使用 C NET 3 5 要求是为用户提供进行确认的选项 确认是使用 XML 和 XSLT 创建的 通常是通过电子邮件发送的 有没有办法可以获取由转换 HTML 字符串
  • 使用 iText 将 tiff 文件转换为 pdf 文件时出现异常

    当我尝试转换tiff文件至pdf文件通过使用itextpdf 5 5 5 出现以下异常 java lang RuntimeException 扫描线必须以 EOL 代码字开头 在 com itextpdf text pdf codec TI
  • 在 PIL 中使用 TIFF G4 图像

    我编写了一个纯 python TIFF G4 解压缩以供使用tifffile py 我知道有一些方法可以添加libtiff自定义 PIL 但我永远无法让它在混合 virtualenv 中很好地工作 我想在PIL中操作图像 我正在寻找将我的减
  • 从 DatagridView 创建 Tiff 位图文件

    我想从 Datagridview 创建 Tiff 文件 我能够将 Datagridview 获取到 Tiff 文件 但我只想要行和列 而不需要其他任何东西 不使用第三方工具可以实现吗 Private Sub Form1 Load sende
  • 扫描仪扫描文档(TIFF 和 PDF)的最佳设置[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 扫描仪的最佳设置是什么 以便扫描文档 白色和黑色文本 并将其用于 OCR 转换 以获得最佳结果 以及 PDF 和 TIFF 格式的标准设置和规范是什么 对于 OCR 最佳扫描设置是
  • 使用 python 将 tiff 堆栈加载到 numpy 数组中

    我在 tif 文件方面遇到了一些问题 我确信这只是一个我无法解决的小问题 请记住 我是一个相对较新的程序员 基本上 我准备了大小为 64x64xn 的 tif 文件 n 最多 1000 该图像只是包含所有这些切片的单个文件 我想将图像加载到
  • 将多个多页 tiff 图像合并为单个 tiff C#

    在我的场景中 我有 3 个或更多多页 tiff 图像 我需要将它们合并为单个 tiff 图像 下面是我尝试过的代码 它合并到单个 tiff 图像中 但仅与所有 tiff 图像的第一页合并 private static void MergeT
  • 读取 tiff 文件的尺寸和分辨率而不先加载它

    如何使用如下代码读取 tiff 文件的尺寸 宽度和高度 和分辨率 水平和垂直 而无需先将其加载到内存中 对于大文件来说太慢了 而且我不需要操作它们 Image tif Image FromFile C large size tif floa
  • 如何制作 tiff z-stack 保存或添加元数据?

    我有许多 tiff 文件 我想使用 python 将它们合并到 z 堆栈中 各个文件都有我想保存的元数据 OME https www openmicroscopy org site support ome model ome tiff 在我
  • 无法在 Kivy 中查看 tiff 图像

    problem 我可以使用以下命令加载图片Image kivy 中的模块 但由于某种原因 我无法将 tif 文件加载到 kivy 中 当图像源为 pics lugia png 图像加载得很好 但如果来源是 pics snorlax tif
  • Tiff 中的 Jpeg(jpeg 压缩)

    如何从 JPEG 压缩的 TIFF 文件中提取图像 我已根据 StripOffests 和 StripBytesCount 字段读取字节 但无法从中加载图像 旧式 TIFF JPEG 压缩类型 6 基本上将普通 JFIF 文件填充到 TIF
  • Matlab只打开多页tiff堆栈的第一帧

    我已经在 ImageJ 中使用宏创建了多页 tiff 文件 现在我尝试使用 matlab 打开它 但我只能访问第一帧 这是 imfinfo filename 的结果 因此 我得到 length imfinfo filename 1 File
  • 在Java中将位图图像转换为未压缩的tif图像

    我正在尝试将位图图像转换为未压缩的 tif 文件 以便与 Tesseract OCR 引擎一起使用 我可以使用这种方法来生成压缩的tif文件 final BufferedImage bmp ImageIO read new File inp
  • 将 tiff 像素长宽比更改为正方形

    我正在尝试对多页 tiff 文件执行条形码识别 但是 tiff 文件是从传真服务器 我无法控制 发送给我的 该服务器以非方形像素长宽比保存 tiff 这导致图像由于纵横比而被严重挤压 我需要将 tiff 转换为方形像素长宽比 但不知道如何在
  • 加快写入多个图像 TIFF 的速度?

    我正在尝试将图像堆栈写入 TIFF 文件 图像大小为 256 256 像素 每个堆栈包含 1000 张图像 编写其中一个文件大约需要 4 分钟 所以我的代码很可能有问题 这就是我正在做的 void Tiff WriterSplit floa

随机推荐

  • window10安装vnc无法使用,window10安装vnc无法使用的原因和解决办法

    window10安装vnc无法使用的原因 xff0c 服务器作为网站建设的常用设备 xff0c 在服务器运行过程中起到举足轻重的作用 用户在选择服务器是常用的方式有服务器租用 虚拟主机租用以及服务器托管 xff0c 通过进行文件以及数据的下
  • 企业信息化技术架构展望

    企业用户慢慢的从前期选用一些同行业成功的项目案例来复制 xff0c 或者选用一些知名的咨询公司提出的行业内通用方案 xff0c 转型为自己主动认真思考什么是自己需求 xff0c 什么是真正适合自己的信息化之路 做为企业信息技术架构设计 xf
  • Errors were encountered while processing: google-chrome-stable

    转自 xff1a http omtlab com errors were encountered while processing google chrome stable Many people facing this issue whi
  • virtualbox 命令

    VBoxManage命令详解 xff08 一 xff09 本人对vboxmange命令按我个人的理解作了解释 xff0c 由于本人水平有限难免有错误的地方 xff0c 希望大家帮我指正 VBoxManage v version 显示virt
  • 基于Springboot的物业管理系统_代码

    下载地址 1 1 课题背景 目的及意义 1 1 1 课题背景 互联网 43 改变着我们的生活 xff0c 在传统的社区物业服务领域 xff0c 在服务业主 提升社区服务 质量方面 xff0c 如何与互联网融合 xff1f 顶级互联网技术团队
  • eclips运行generatorConfig.xml文件生成代码

    描述 xff1a 如何通过eclips工具来运行 generatorConfig xml 文件来自动生成代码并获取数据 xff08 类似于mybaits逆向生成 xff09 xff1f mybatis generator generate
  • Spring源码(4)Context篇之AbstractApplicationContext(下)

    上一篇 Spring源码 4 Context篇之AbstractApplicationContext xff08 上 xff09 讲解了Spring的AbstractApplicationContext类refresh 方法 xff0c 前
  • java多线程 一个生产者和多个消费者

    生产者和消费者模式是面试时很容易被问到的一类题 xff0c 在平常的开发中也经常碰到 xff0c 比如在网游开发中 xff1a 用一个线程把收到的字节数据封装起来写到一个队列中 xff0c 然后用一个或多个线程从该队列中把数据读取出来再分发
  • Python最强装逼神技!微信远程控制电脑,想让你电脑关机就关机!

    今天带给大家一个非常有意思的 python 程序 xff0c 基于 itchat 实现微信控制电脑 你可以通过在微信发送命令 xff0c 来拍摄当前电脑的使用者 xff0c 然后图片会发送到你的微信上 甚至你可以发送命令来远程关闭电脑 程序
  • JAVA 在linux下面生成验证码异常问题

    应用部署到Linux下 xff0c 结果首页登录的验证码显示不出来 该验证码是用java的图片包来处理图片的 xff0c 后台日志报错 xff1a java lang NoClassDefFoundError sun awt X11Grap
  • 【PowerShell 一天一练】 3. 调用winrar解压

    如果你安装了 winrar 且安装在对应下面的路径 xff0c 可以尝试一下下面的代码 xff08 事实上我也是 copy 并修改自网上的代码 xff09 unrar 61 c Program files winrar unrar exe
  • 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
  • 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
  • mysql存储过程及拼接字符串的用法

    DROP PROCEDURE IF EXISTS insert historytable DELIMITER CREATE PROCEDURE insert historytable BEGIN 定义判断变量 DECLARE 1 id va
  • 矩阵的特征值和特征向量的雅克比算法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文件