您的位置:首页 > 其它

读取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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: