C++读写tif文件
当初第一次接触tif格式的图像,按照教程读取了一下,程序如下,后来发现opencv就可以读取
imread 参数设置为 IMREAD_UNCHANGED
#include<iostream>
#include <opencv2/opencv.hpp>#ifndef TIFREADER_H
#define TIFREADER_H #include <stdio.h>
#include <string.h>#ifndef NULL
#define NULL 0
#endif#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif#define BYTE shortusing namespace std;
//using namespace cv;typedef struct
{unsigned short Byte_order;//unsigned short Version;//校验文件是否是TIF文件unsigned int OffsetToFirstFID;//相对对文件开始处的偏移量// unsigned short wDECount;//多少目录入口
}IFH;typedef struct
{unsigned short tag;//属性的编号unsigned short type;//数据类型unsigned long length;//数据的数量unsigned long valueOffset;//tag标识的属性代表的变量值相对文件开始处的偏移量
}DE;
typedef struct
{int width;int height;}Size;
typedef struct
{short *data;
}DATA;typedef struct
{DE *pde;int wDECount;
}PDE;bool readTIF(char* path, IFH &ifh, PDE &de, Size &size, DATA &Data)
{//unsigned char *data;short *data;short *dat;unsigned short wDECount;//多少目录入口//FILE* fp = NULL;//errno_t err = 0;//err = fopen_s(&fp, path, "r");FILE *fp;fp = fopen(path, "r");//fp = fopen_s(path, "rb");if (fp == NULL){cout << "open file error" << endl;return false;}if (sizeof(IFH) != fread(&ifh, 1, sizeof(IFH), fp)){cout << "读TIF文件头失败";return FALSE;}cout << ifh.Version << endl;if (0x2a != ifh.Version) // 42{cout << "该文件不是TIF格式,读文件失败";return FALSE;}if (0x4949 != ifh.Byte_order) //18761{cout << "该TIF文件不是IBMPC字节序,读文件失败";return FALSE;}fseek(fp, ifh.OffsetToFirstFID, SEEK_SET);//将文件指针定位到IFD//读文件有多少个目录入口 if (2 != fread(&wDECount, 1, sizeof(unsigned short), fp)){cout << "无法获得TIF文件目录入口数量";return FALSE;}cout << "该TIF文件有" << wDECount << "个目录入口" << endl;//创建DE数组,接收信息,数组中有wDECount个元素 de.pde = new DE[wDECount];DE* pTemp = de.pde;de.wDECount = wDECount;memset(de.pde, 0, sizeof(DE)*wDECount);if (sizeof(DE)*wDECount != fread(de.pde, 1, sizeof(DE)*wDECount, fp)){cout << "读图象文件目录失败";delete[]de.pde;return false;}//把图像的大小和图像数据的容量保存到成员变量中int m_size_x;int m_size_y;int m_size;int m_channel;int i;for (i = 0; i<wDECount; i++){pTemp = de.pde + i;cout << pTemp->tag << endl;if (256 == pTemp->tag) //tag为256的目录入口中的变量标识了图象宽度{m_size_x = pTemp->valueOffset;}if (257 == pTemp->tag) //图象高度{m_size_y = pTemp->valueOffset;}if (278 == pTemp->tag){m_channel = pTemp->valueOffset;}// For each strip, the byte offset of that strip.if (273 == pTemp->tag) //计算图象数据占用字节数{//m_dwBmSize = pTemp->valueOffset - sizeof(IFH);//或者把tag=256的valueOffset乘以tag=257的valueOffsetm_size = m_size_x * m_size_y;}}m_channel = pTemp->valueOffset;//填充所有像素数据, 颠倒图象数据从最后一行开始读起int j = 0;// int i = 0;data = (short*)malloc(m_size * sizeof(BYTE));dat = (short*)malloc(m_size * sizeof(BYTE));//IFH - 图像数据 - IFDfseek(fp, sizeof(IFH), SEEK_SET); //文件开头fread(data, sizeof(BYTE), m_size, fp);//fread(imagedata, sizeof(struct tagIMAGEDATA) * width, height, fpi);//for (i = m_size_y - 1; i >= 0; i--)//{// fseek(fp, sizeof(IFH) + i*m_size_x, SEEK_SET); //文件开头// fread((BYTE*)(data + 1) + j*m_size_x, sizeof(BYTE), m_size_x, fp);// j++;//}//for (i = m_size_y - 1; i >= 0; i--)//{// fseek(fp, sizeof(IFH) + i*m_size_x, SEEK_SET); //文件开头// fread((BYTE*)(data + 1) + j*m_size_x, sizeof(BYTE), m_size_x, fp);// j++;//}cv::Mat tmp;tmp.create(m_size_y, m_size_x, CV_16UC1); //创建Matmemcpy(tmp.data, data, m_size * sizeof(short)); //内存拷贝fp = nullptr;//for (int i = 0; i < m_size_y; i++)//{// // for (int j = 0; j < m_size_x; ++j)// {// cout << tmp.at<short>(i, j) << " "; // // }// cout << endl;//}//free(data);/*cv::namedWindow("1", 1);cv::imshow("1", tmp);*/cout << "width:" << m_size_x << endl;cout << "height:" << m_size_y << endl;short * p;p = data;short *ptr;ptr = dat;for (i = 0; i<m_size; i++, p++, ptr++){*ptr = (short)(*p);short h = *ptr;cout<<h<<" ";}size.width = m_size_x;size.height = m_size_y;Data.data = dat;return TRUE;}int main()
{IFH ifh;PDE de;Size size;DATA Data;char * path = "16.tif";//cv::Mat test2 = cv::imread("16.tif", CV_LOAD_IMAGE_ANYDEPTH);//cout << " " << test2.depth() << endl;//for (int i = 0; i < test2.rows; i++)//{// for (int j = 0; j < test2.cols; j++)// {// cout << test2.at<unsigned short>(i, j) << endl;// }//}//cout << test2.at<unsigned short>(0, 0) << endl;bool b = readTIF(path, ifh, de, size, Data);cout << Data.data << endl;cout << b << endl;cv::waitKey(0);system("pause");return 0;
}bool saveTIF(char* path, IFH ifh, PDE de, Size size, DATA Data)
{unsigned char *data;// unsigned short wDECount;//多少目录入口// ZeroMemory(&ifh, sizeof(IFH));// ZeroMemory(&de, sizeof(DE));FILE *fp;fp = fopen(path, "wb");if (fp == NULL){cout << "open file error" << endl;return false;}if (sizeof(IFH) != fwrite(&ifh, 1, sizeof(IFH), fp)){cout << "写TIF文件头失败";return FALSE;}fseek(fp, ifh.OffsetToFirstFID, SEEK_SET);//将文件指针定位到IFD//读文件有多少个目录入口 if (2 != fwrite(&de.wDECount, 1, sizeof(unsigned short), fp)){cout << "无法获得TIF文件目录入口数量";return FALSE;}//创建DE数组,接收信息,数组中有wDECount个元素 if (sizeof(DE)*de.wDECount != fwrite(de.pde, 1, sizeof(DE)*de.wDECount, fp)){cout << "读图象文件目录失败";return false;}//填充所有像素数据, 颠倒图象数据从最后一行开始读起int j = 0;int i = 0;data = (unsigned char*)malloc(size.width*size.height * sizeof(BYTE));short *ptr = Data.data;unsigned char* p;p = data;for (i = 0; i<size.width*size.height; i++, p++, ptr++){*p = (unsigned char)(*ptr);// int h= *ptr;// cout<<h<<" ";}for (i = size.height - 1; i >= 0; i--){fseek(fp, sizeof(IFH) + i*size.width, SEEK_SET);fwrite((BYTE*)(data + 1) + j*size.width, sizeof(BYTE), size.width, fp);j++;}return TRUE;}
#endif
C++读写tif文件相关推荐
- python读写tif文件
个人整理的python地理信息库,本文代码也在其中,欢迎使用: https://github.com/Adam0429/geo-py 顺便帮公司打个广告,欢迎遥感类专家的加入-- 投简历戳这里,英视睿 ...
- python中利用GDAL对tif文件进行读写
利用GDAL库对tif影像进行读取 示例代码默认波段为[B.G.R.NIR的顺序,且为四个波段] import gdal def readTif(fileName):dataset = gdal.Op ...
- txt文本文件数据转ArcGIS中的tif文件
txt 文本文件数据转 ArcGIS 中的 tif 文件 txt文件容易读写,但可视性不好: tif文件在ArcGIS上显示具有独特优势,但打开属性表是多有不变 以广东省某蒸散发数据为依据,将网格对应 ...
- 利用MATLAB批量读写tif数据(Landsat78)
利用MATLAB批量读写tif数据(Landsat7&8) 代码来源于:批量读写 代码如下: clc;clear %% 读取NDVI-tif文件 file_path_N = 'E:\';% 图 ...
- matlab对tif文件的相关操作
前言: 本片博客记录了使用matlab读取tif文件的像素数组.标签信息,以及写tif文件. 问题前瞻: 无法对已有的tif文件重新读取和写操作 写操作成功,但显示跟原tif文件不一样,有时出现全黑的 ...
- 利用pandas读写HDF5文件
一.简介 HDF5(Hierarchical Data Formal)是用于存储大规模数值数据的较为理想的存储格式,文件后缀名为h5,存储读取速度非常快,且可在文件内部按照明确的层次存储数据,同一个H ...
- OpenCV读写视频文件解析(二)
OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++: bool VideoCapture::set(int propId, double value ...
- OpenCV读写视频文件解析
OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在OpenCV 中,VideoCapture 类 ...
- dom4j读写xml文件
dom4j读写xml文件 首先我们给出一段示例程序: import java.io.File; import java.io.FileWriter; import java.util.Iterator ...
- 使用WinPcap和libpcap类库读写pcap文件(002)PCAP文件格式
本文基本翻译自https://wiki.wireshark.org/Development/LibpcapFileFormat,主要分析pcap文件的格式. 其中一些字段可能和现在的WinPcap类库 ...
最新文章
- 一些意想不到的小bug。
- 在Servlet中实现页面重定向
- 【数据结构与算法】之深入解析“最接近的三数之和”的求解思路与算法示例
- 遍历List过程中同时修改
- (acm)C++加速输入的几种方法
- C和C++里面的lvalue 和 rvalue的释义
- java 多线程共享变量两类问题_Java并发基础09. 多个线程间共享数据问题
- How to Install apk to Android Devices from Mac OS X
- linux下oracle10g安装配置说明,Linux下oracle10g安装配置说明(ZT)
- java concurrent int_Java高级特性系列--Concurrent
- python训练营微信广告发送机_python实现给微信公众号发送消息的方法
- GridView控件事件详解
- 制作芭奇站群软件自定义发布接口命令大全
- 连接服务器显示句柄无效,紧急求助!!1 打印机不能打印 提示:句柄无效...
- 蚂蚁安全键盘空白或应该显示安全键盘却显示的系统键盘的问题(iOS中时间佛历如何转换为公历)
- cocos creator pc web端 全屏
- Property dataSource threw exception
- AMD显卡性能测试软件,谁更适合Win7?AMD与NVIDIA显卡性能对比
- Gut:中国药科大学周伟等团队在肠道菌群驱动风湿性关节炎机制研究和中药干预方面取得新进展...
- omap4430驱动