读取MP3专辑图片
2016-06-27 20:02
316 查看
#define WIN32_LEAN_AND_MEAN #define NOWINRES #define NOSERVICE #define NOMCX #define NOIME #include "windows.h" #include <stdio.h> #include <malloc.h> #define TAG_SIZE(a) (((a)[0]&0x7F)*0x200000 + ((a)[1]&0x7F)*0x4000 + ((a)[2]&0x7F)*0x80 + ((a)[3]&0x7F)) #define FME_SIZE(a) ((a)[0]*0x1000000 + (a)[1]*0x10000 + (a)[2]*0x100 + (a)[3]) #pragma pack(1) struct ID3V2Header { BYTE Header[3]; BYTE Version; BYTE reVersion; BYTE Flag; BYTE Size[4]; }; struct ID3V2Frame { BYTE FrameID[4]; BYTE Size[4]; BYTE Flag[2]; }; #pragma pack() BOOL WINAPI ExtractAlbum(const char *inputFile, const char *outputFile) { FILE *f = fopen(inputFile, "rb"); if (!f) return FALSE; BOOL success = FALSE; ID3V2Header hdr; if (fread(&hdr, sizeof(hdr), 1, f) != 1) goto err; if (memcmp(hdr.Header, "ID3", 3)) goto err; while (!feof(f)) { if (ftell(f) - sizeof(hdr) >= TAG_SIZE(hdr.Size)) break; ID3V2Frame frame; if (fread(&frame, sizeof(frame), 1, f) != 1) break; if (!memcmp(frame.FrameID, "APIC", 4)) { size_t pos = ftell(f); int ofs = fgetc(f) ? 7 : 2; while (fgetc(f)) {} fseek(f, ofs, SEEK_CUR); size_t len = (pos + FME_SIZE(frame.Size)) - ftell(f); void *buf = malloc(len); if (fread(buf, len, 1, f) == 1) { FILE *fpic = fopen(outputFile, "wb"); if (fpic) { fwrite(buf, len, 1, fpic); fclose(fpic); success = TRUE; } } free(buf); continue; } fseek(f, FME_SIZE(frame.Size), SEEK_CUR); } err: fclose(f); return success; }
相关文章推荐
- android代码的形式让button变成圆角 透明,如图
- push推送的使用
- Java之System.arraycopy实现数组拷贝-类似C语言的memcpy
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- 好久没写了,总结一发
- 面向对象软件工程复习之练习题之一
- 软件测试学习笔记
- button点击无反应
- jquery特效-鼠标点击上下伸缩式菜单
- sift
- mac 安装tensorflow
- RPi--lab8网络矩阵显示
- 堆的判断(codevs 2879)
- CNN
- 十五.设置UIScrollView滚动速度
- Visual Studio 2015 企业版 官方中文版.iso
- Bootstrap modal修改宽度
- pcmcia和CF
- 十四.给UIView子类设置阴影,包括各种控件
- Raknet性能调研