matlab基础篇——遍历循环读取所有tiff文件

matlab基础篇——遍历循环读取所有tiff文件,第1张

%遍历循环读取所有tiff文件

file_path = 'E:\singleWoodSegement\CHMfenge(0.25)\'% 图像文件夹路径

img_path_list = dir(strcat(file_path,'*.tif'))%获取该文件夹中所有TIF格式的图像

用 gdal库。

库参考和下载在这:http://www.gdal.org/

下面这个文件瞎写的,你可以修改下。。需要加装库,头文件和lib

//tif.h

enum

{

TOPX = 0,

CELLX,

XXXX,

TOPY,

XXXXX,

CELLY,

GeoTfInfoArrCount

}

 template<typename type, int nBand =1>

 class CTifFileOp

 {

 public:

 CTifFileOp(string FilePath=string(""))

virtual ~CTifFileOp()

double get_nodata_value()

{

return m_pDataset->GetRasterBand(nBand)->GetNoDataValue()

}

int GetGeoTransform(double* gt)const

int ChangeFile(string strPath)

void ReadTiffDataset(type * DataGet, int begRow = 0, int begCol = 0, int numRows = 1, int numCols = 1)const

void WriteTiffDataset(type * DataGet, int begRow = 0, int begCol = 0, int numRows = 1, int numCols = 1)

void ReadTiffDataset(vector<type> & DataGet, int begRow = 0, int begCol = 0, int numRows = 1, int numCols = 1)const

{

DataGet.clear()

DataGet.resize(numCols*numRows)

ReadTiffDataset(&*DataGet.begin(), begRow, begCol, numRows, numCols)

}

size_t GetColNum()

{

openDs()

return m_pDataset->GetRasterXSize()

}

size_t GetRowNum()

{

openDs()

return m_pDataset->GetRasterYSize()

}

//获取波段数

int GetRasterCount()

{

openDs()

return m_pDataset->GetRasterCount()

}

//获取坐标系信息

const char * GetProjectionRef()

{

openDs()

return m_pDataset->GetProjectionRef()

}

//获取数据类型

GDALDataType GetDataType(int iRaster = nBand)

{

openDs()

return m_pDataset->GetRasterBand(iRaster)->GetRasterDataType()

}

void GetAllData(vector<type> & DataGet)

{

//   double geoInfo[GeoTfInfoArrCount] = { 0 }

//   GetGeoTransform(geoInfo)

openDs()

ReadTiffDataset(DataGet, 0, 0, GetRowNum(), GetColNum())

}

 private:

 string m_strFile

 GDALDataset *m_pDataset = nullptr

 bool m_bWrite = false

 private:

 void openDs(GDALAccess openMode = GA_ReadOnly)

 bool CanWrite()const

 {

 return m_bWrite

 }

}

 

 template<typename type, int nBand>

 int CTifFileOp<type, nBand>::GetGeoTransform(double* gt) const

 {

// openDs()

 m_pDataset->GetGeoTransform(gt)

 return 0

 }

 

 template<typename type, int nBand>

 CTifFileOp<type, nBand>::CTifFileOp(string FilePath)

 :m_strFile(FilePath), m_pDataset(nullptr)

 {

openDs()

 }

 template<typename type, int nBand>

 CTifFileOp<type, nBand>::~CTifFileOp()

 {

if (m_pDataset)

{

GDALClose(m_pDataset)

m_pDataset = nullptr

//是这样关闭 数据集 么?

}

 }

 template<typename type, int nBand>

 void CTifFileOp<type, nBand>::openDs(GDALAccess openMode)

{

 if (m_pDataset)//当不为nullptr,认为是打开的

 {

 return

 }

GDALAllRegister()

const char *pszFormat = "GTiff"

GDALDriver *poDriver

poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat)

if (poDriver == nullptr){

return

}

if (!m_strFile.empty())

{

m_pDataset = ((GDALDataset *)GDALOpen(m_strFile.c_str(), openMode))

//  if (m_pDataset != NULL)

//  {

//  int ibandCounts = m_pDataset->GetRasterCount()

//  ibandCounts |= (long(1)<<0)

//  }

if (GA_Update == openMode)

{

m_bWrite = true

}

else

m_bWrite = false

}

// OGRCleanupAll()

}

template<typename type, int nBand>

int CTifFileOp<type, nBand>::ChangeFile(string strPath)

{

m_strFile = strPath

if (m_pDataset)

{

GDALClose(m_pDataset)

m_pDataset = nullptr

//是这样关闭 数据集 么?

}

openDs()

return 0

}

template<typename type, int nBand>

void CTifFileOp<type, nBand>::ReadTiffDataset(type * DataGet, int begRow, int begCol, int numRows, int numCols)const

{

if (!DataGet || !m_pDataset)

{

return

}

if (begRow < 0 || begCol < 0 || numRows <= 0 || numCols <= 0)

{

return

}

GDALDataType datatype = m_pDataset->GetRasterBand(nBand)->GetRasterDataType()

//不知道下面读数据的这个类型参数有什么意义

m_pDataset->RasterIO(GF_Read,begCol,begRow,numCols,numRows,DataGet,numCols,numRows,datatype,1,0,0,0,0)

}

template<typename type,int nBand>

void CTifFileOp<type, nBand>::WriteTiffDataset(type * DataGet, int begRow, int begCol, int numRows, int numCols)

{

if (!DataGet || !m_pDataset)

{

return

}

if (begRow < 0 || begCol < 0 || numRows <= 0 || numCols <= 0)

{

return

}

if (!CanWrite())

{

GDALClose(m_pDataset)

m_pDataset = nullptr

openDs(GA_Update)

}

GDALDataType datatype = m_pDataset->GetRasterBand(nBand)->GetRasterDataType()

//不知道下面读数据的这个类型参数有什么意义

m_pDataset->RasterIO(GF_Write, begCol, begRow, numCols, numRows, DataGet, numCols, numRows, datatype, 1, 0, 0, 0, 0)

}

public class Tiff2JPEG {

public static int DISPLAY_WIDTH = 640

public static boolean doTiff2JPEG (String filename, String imageDir) {

File file = new File(imageDir + filename)

SeekableStream s = null

TIFFDecodeParam param = null

RenderedImage op = null

String simplefilename = filename.substring(0,filename.lastIndexOf("."))

RenderedOp image = null

try {

s = new FileSeekableStream(file)

ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param)

int numofpages = dec.getNumPages()

for (int i=0i<numofpagesi++) {

op = new NullOpImage

(dec.decodeAsRenderedImage(i),null,null,OpImage.OP_COMPUTE_BOUND)

image = JAI.create("stream", op)

int width = op.getWidth()

int height = op.getHeight()

double conversionFactor = (double)DISPLAY_WIDTH / (double)width

float conversionFactor_ = DISPLAY_WIDTH / width

int thumbHeight = (int)((double)height * conversionFactor)

int thumbWidth = (int)((double)width * conversionFactor)

Dimension dim = new Dimension(thumbHeight, thumbWidth)

JAI.setDefaultRenderingSize(dim)

JAI.setDefaultTileSize(dim)

JAI.create("filestore",

image, imageDir + simplefilename + "." + i + ".png", "png")

}

} catch (IOException e) {

System.out.println(e.getLocalizedMessage())

return false

}

return true

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/tougao/11536833.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存