int openFile(const char * name) { memset(&inf, 0, sizeof(inf)); readOff = readBuf; if((fp = fopen(name, "rb"))) { fileSize = get_fileSize(fp); char magic[3]; fread(&magic, 1, 3, fp); if(IS_ID3_V2(magic)) { parseID3_V2(fp); } else rewind(fp); if((dataLeft = fread(readBuf, 1, READ_BUF_SIZE, fp))==READ_BUF_SIZE) { mdecoder = MP3InitDecoder(); if(!findValidSync(&readOff, &dataLeft)) { MP3GetLastFrameInfo(mdecoder, &inf); bitrate = inf.bitrate; return 1; } } } return 0; }
bool AdobeThumbnail(const char* adobe_filename , const char* savejpeg_filename) { string file_ext(adobe_filename); string rs = "(.+)(\\.(?:ai|AI|indd|INDD|Indd|eps|EPS|Eps))"; // 正则字符串,exp开始的单词 std::regex expression(rs); // 字符串传递给构造函数,建立正则表达式 bool ret = std::regex_match(file_ext, expression); if (!ret) { // cout << "文件格式不对!\n"; return ret ; } if (!IsFileExist(adobe_filename)) return false ; // 文件不存在 char* pch = NULL; const char* flag = "pGImg:image"; // AI 和 Indd 稍微不同 /// ************* 获取 ID或者AI文档 的预览图 **************** /// FILE* adobe_file = fopen(adobe_filename, "rb"); size_t file_size = get_fileSize(adobe_filename); // 获得文件大小 size_t bufsize = 1 * MBsize; // AI 和EPS 预览图在开头,INDD文件在末位 char* filebuf = new char[bufsize]; // 文件读到缓冲 // 文件小于2M 整个文件读,否则遍历读最后2M if (file_size < bufsize) { bufsize = file_size; fread(filebuf, 1, bufsize, adobe_file); if (0xF5ED0606 == *(DWORD*)filebuf) { // indd 文件开头好像都这样 pch = memfind(filebuf, flag , bufsize); // INDD 可能不只一个预览图 if ((pch != NULL)) while ((pch != NULL) && (strlen(pch) < 10 * 1024)) pch = memfind(pch + 1, flag , bufsize - (pch - filebuf)); } else pch = memfind(filebuf, flag , bufsize); } else { fread(filebuf, 1, bufsize, adobe_file); // 00000000h: 06 06 ED F5 D8 1D 46 E5 BD 31 EF E7 FE 74 B7 1D ; ..眭?F褰1镧? // 00000010h: 44 4F 43 55 4D 45 4E 54 01 70 0F 00 00 05 00 00 ; DOCUMENT.p...... if (0xF5ED0606 == *(DWORD*)filebuf) { // indd 文件开头好像都这样 fseek(adobe_file, (file_size - bufsize), SEEK_SET); fread(filebuf, 1, bufsize, adobe_file); pch = memfind(filebuf, flag , bufsize); // INDD 可能不只一个预览图 if ((pch != NULL)) while ((pch != NULL) && (strlen(pch) < 10 * 1024)) pch = memfind(pch + 1, flag , bufsize - (pch - filebuf)); } else pch = memfind(filebuf, flag , bufsize); // AI 应该只有一个预览信息, } // 读取文件结束,关闭 fclose(adobe_file); if (pch == NULL) { flag = "%AI7_Thumbnail:"; size_t width, height, bitCount, Hexsize; char AI7_Thumbnail[64]; char BeginData[64]; char Hex_Bytes[64]; pch = memfind(filebuf, flag , bufsize); // 检测到AI低版本预览图标记 if (pch != NULL) { sscanf(pch, "%s %d %d %d\n%s %d %s\n", AI7_Thumbnail, &width, &height, &bitCount , BeginData, &Hexsize , Hex_Bytes); pch = memfind(filebuf, "Hex Bytes" , bufsize); } if (pch != NULL) { // 解码 AI7_Thumbnail 为 图片 char savepng_filename[MAX_PATH]={0}; // 源图是 BMP,保存png 失真少一点 strncpy(savepng_filename , savejpeg_filename, strlen(savejpeg_filename) - 4); strcat(savepng_filename, ".png"); string AI7Thumb(pch + 10 , Hexsize + 1); decode_Ai7Thumb_toPng(AI7Thumb , width, height , savepng_filename); delete[] filebuf; // 释放文件缓冲 return true; } }; if (pch == NULL) ret = false; if (!ret) { // 没有找到,返回前 delete[] filebuf; // 释放文件缓冲 return ret; } strtok(pch, "\r\n"); string Base64_str(pch); std::regex ex("pGImg:image>|<\\/x\\wpGImg:image>|pGImg:image=\""); std::regex en("
"); // 正则删除 xmpGImg 标记和 转意换行替换回来 Base64_str = std::regex_replace(Base64_str, ex, string("")); Base64_str = std::regex_replace(Base64_str, en, string("\n")); #if(AITEST) printf( "pGImg:image标记偏移: %d 在文件%s\n" , pch - filebuf , adobe_filename); #endif /// =============================== 解码一个Base64 的JPEG文件 ==============================//// int b64len = Base64_str.size(); int jpglen = fromBase64_Decode(Base64_str.c_str() , b64len , filebuf , b64len); FILE* jpeg_file = fopen(savejpeg_filename, "wb"); fwrite(filebuf, 1 , jpglen , jpeg_file); delete[] filebuf; // 释放文件缓冲 fclose(jpeg_file); return true; }
////////////////////////////////////////////////////////////////////////// /// 保存所选文件GPS点到map容器 /// para1:filename-----所选文件名 /// para2:n------------list控件行索引号 /// para3:list_ctrl----list控件 /// parq4:map_gps_point---GPS点map容器 ////////////////////////////////////////////////////////////////////////// void SaveGPSPointToMap(const char* filename, const int n, CCoolListCtrl &list_ctrl, std::map<time_t, GPS_POINT>& map_gps_point) { FILE* pFile = fopen(filename, "rb"); if (!pFile) { list_ctrl.SetItemColor(n, RGB(255, 0, 0)); list_ctrl.SetItemText(n, 1, "此文件无法打开,已忽略..."); return; } size_t data_size = get_fileSize(filename); int32_t gz_header_3byte = GZ_HEADER_3BYTE; fread(&gz_header_3byte, 1, sizeof(gz_header_3byte), pFile); rewind(pFile); // 判断是否是gz文件 bool is_gzfile = (GZ_HEADER_3BYTE == (gz_header_3byte & 0xFFFFFF)); char* buffer = NULL; if (is_gzfile) { // 读取gz文件,解压bdgps轨迹文件到内存 data_size = get_gzbinSize(filename); gzFile gzf = gzopen(filename, "rb"); buffer = new char[data_size + 1]; buffer[data_size] = 0; if (gzread(gzf, buffer, data_size) < 0) return; gzclose(gzf); } else { buffer = new char[data_size]; fread(buffer, 1, data_size, pFile); } // 分析内存中的数据 char *gps_buffer = buffer; GPS_FILEHEAD* gps_filehead = (GPS_FILEHEAD*)gps_buffer; // bin文件头 if (!((gps_filehead->empty_1 == 0x00) && (gps_filehead->data_pos == 0x18))) //判断是否是bin轨迹文件 { list_ctrl.SetItemColor(n, RGB(255, 0, 0)); list_ctrl.SetItemText(n, 1, "此文件不是轨迹文件,已忽略..."); return; } if (n == 0) // 获取第一个文件的文件头 { memcpy(&first_file_gps_filehead, gps_filehead, sizeof(GPS_FILEHEAD)); } // 兼容旧版本 02 04 05 和当前 06版本数据,使用指针回退,兼容数据结构不一样长 int ver_offset = 0; if (gps_filehead->data_ver == 5) { ver_offset = sizeof(int32_t); } else if (gps_filehead->data_ver <= 4) { ver_offset = 2 * sizeof(int32_t); } GPS_POINT* gps_point = (GPS_POINT*)(gps_buffer + gps_filehead->data_pos); // 第一条GPS记录 int gps_point_total = (data_size - gps_filehead->data_pos) / (sizeof(GPS_POINT) - ver_offset); // GPS记录条目数 int fraction = 10; // 默认输出10个GPS点间距 int count = fraction; while (gps_point_total--) { if (count % fraction == 0) { map_gps_point.insert(std::make_pair(gps_point->timestamp, *gps_point)); count--; } else if ((--count) == 0) { count = fraction; } gps_point++; gps_point = (GPS_POINT*)((char*)gps_point - ver_offset); // 兼容旧版本 02 04 05 当作 06版本数据读,读好来个指针回退 } gps_point = (GPS_POINT*)((char*)gps_point + ver_offset); --gps_point; map_gps_point.insert(std::make_pair(gps_point->timestamp, *gps_point)); list_ctrl.SetItemText(n, 1, "此文件合并完成!!!"); fclose(pFile); delete[] buffer; return; }