之前生成的gdal 2.1.1动态库,在通过命令行执行时,遇到有中文路径或中文图像名时,GDALOpen函数不能正确的被调用,如下图:
解决方法:
1. 在所有使用GDALAllRegister();语句后面加上一句CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
2. 修改源码:将frmts/gdalallregister.cpp文件中GDALAllRegister()函数体内最上面加是一条CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");语句。
这里采用的是第一种方法,修改后的测试代码如下:
int test_gdal_support_chinese_path(int argc, char* argv[]) { if (argc < 2) { fprintf(stderr, "params fail\n"); return -1; } GDALAllRegister(); CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); GDALDataset* poSrc = (GDALDataset*)GDALOpen(argv[1], GA_ReadOnly); if (poSrc == nullptr) { std::cout << "input image error" << std::endl; return -1; } int width_src = poSrc->GetRasterXSize(); int height_src = poSrc->GetRasterYSize(); int band_count_src = poSrc->GetRasterCount(); fprintf(stderr, "image width: %d, height: %d, bandCount: %d\n", width_src, height_src, band_count_src); GDALDataType gdal_data_type = poSrc->GetRasterBand(1)->GetRasterDataType(); int depth = GDALGetDataTypeSize((GDALDataType)gdal_data_type); fprintf(stderr, "depth: %d\n", depth); GDALClose((GDALDatasetH)poSrc); return 0; }
结果如下图:
如果使用到OGRAllRegiser()函数,为了支持中文,那么也需要作同样的修改。