去年工作中,有用到tiff图像处理。开始的时候直接用QT的Qimage进行图像加载。然后发现大的TIFF图像用这个加载不进去。寻找原因,是由于TIFF图像分为标准TIFF和BIG TIFF两种格式,而QT的Qimage只支持标准的格式。
然后,用GDAL库支持BIG TIFF格式读取。然后发现在TIFF文件很大的时候在new内存的时候,常常发生电脑卡死的情况。又开始了分块读入TIFF图像。
最终的读取方式:
.........
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); //支持中文路径
GDALDataset* poDataset = (GDALDataset *)GDALOpen(imgPath, GA_ReadOnly);
if (poDataset == nullptr)
{
// "Can't Open Image!"
this->allowClose = true;
return ;
}
....
......
poDataset->RasterIO(GF_Read, ImgK_Px_min, ImgK_Py_max, crop_width, crop_height,
data3, crop_width, crop_height, GDT_Byte, band_count, pBandMap, band_count, crop_width*band_count, 1);
.......
.....
从(ImgK_Px_min,ImgK_Py_max)点读取长宽为(crop_width,crop_height)的一块矩形图像。RasterIO(…,band_count, crop_width*band_count, 1)代表的是按照一行一行的进行数据存储到data3这个buffer里面。
另外,在调试过程中,注意,最后一块和开头一块的起始和结束位置。起始像素是(0,0),结束像素是(imgWidth-1,imgHeight-1)。