Пример #1
0
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;
}
Пример #2
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("&#xA;");
    // 正则删除 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;
}