1. #define WIN32_LEAN_AND_MEAN
  2. #define NOWINRES
  3. #define NOSERVICE
  4. #define NOMCX
  5. #define NOIME
  6. #include "windows.h"
  7.  
  8. #include <stdio.h>
  9. #include <malloc.h>
  10.  
  11. #define TAG_SIZE(a) (((a)[0]&0x7F)*0x200000 + ((a)[1]&0x7F)*0x4000 + ((a)[2]&0x7F)*0x80 + ((a)[3]&0x7F))
  12. #define FME_SIZE(a) ((a)[0]*0x1000000 + (a)[1]*0x10000 + (a)[2]*0x100 + (a)[3])
  13.  
  14. #pragma pack(1)
  15.  
  16. struct ID3V2Header
  17. {
  18. BYTE Header[];
  19. BYTE Version;
  20. BYTE reVersion;
  21. BYTE Flag;
  22. BYTE Size[];
  23. };
  24.  
  25. struct ID3V2Frame
  26. {
  27. BYTE FrameID[];
  28. BYTE Size[];
  29. BYTE Flag[];
  30. };
  31.  
  32. #pragma pack()
  33.  
  34. BOOL WINAPI ExtractAlbum(const char *inputFile, const char *outputFile)
  35. {
  36. FILE *f = fopen(inputFile, "rb");
  37.  
  38. if (!f)
  39. return FALSE;
  40.  
  41. BOOL success = FALSE;
  42.  
  43. ID3V2Header hdr;
  44.  
  45. if (fread(&hdr, sizeof(hdr), , f) != )
  46. goto err;
  47.  
  48. if (memcmp(hdr.Header, "ID3", ))
  49. goto err;
  50.  
  51. while (!feof(f))
  52. {
  53. if (ftell(f) - sizeof(hdr) >= TAG_SIZE(hdr.Size))
  54. break;
  55.  
  56. ID3V2Frame frame;
  57.  
  58. if (fread(&frame, sizeof(frame), , f) != )
  59. break;
  60.  
  61. if (!memcmp(frame.FrameID, "APIC", ))
  62. {
  63. size_t pos = ftell(f);
  64.  
  65. int ofs = fgetc(f) ? : ;
  66.  
  67. while (fgetc(f)) {}
  68.  
  69. fseek(f, ofs, SEEK_CUR);
  70.  
  71. size_t len = (pos + FME_SIZE(frame.Size)) - ftell(f);
  72.  
  73. void *buf = malloc(len);
  74.  
  75. if (fread(buf, len, , f) == )
  76. {
  77. FILE *fpic = fopen(outputFile, "wb");
  78.  
  79. if (fpic)
  80. {
  81. fwrite(buf, len, , fpic);
  82. fclose(fpic);
  83.  
  84. success = TRUE;
  85. }
  86. }
  87.  
  88. free(buf);
  89.  
  90. continue;
  91. }
  92.  
  93. fseek(f, FME_SIZE(frame.Size), SEEK_CUR);
  94. }
  95.  
  96. err:
  97. fclose(f);
  98.  
  99. return success;
  100. }

读取MP3专辑图片的更多相关文章

  1. WPF 显示 mp3 专辑图片

    mp3 专辑图片是属于 mp3 的 tag 的一部分,安装 taglib# 的 nuget 安装包到项目.这里使用 TagLib.Portable https://www.nuget.org/pack ...

  2. C#读取MP3文件的专辑图片和ID3V2Tag信息(带代码)

    第二次更新,后面的代码有问题,有些专辑图片读取不到.发现是PNG图片的问题.在读取的过程中调试发现,图片帧前10个字节包含了图片的格式,在有些歌曲写着JPEG的格式,数据却是PNG的.先说下思路. j ...

  3. mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换等

    mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换(上) MP3文件格式(二)---ID3v2 图:ID3V1标签结构 图:ID3V2标签 ...

  4. 【ASP.NET 进阶】获取MP3文件信息并显示专辑图片

    突发奇想,想弄个显示MP3文件信息和专辑图片的小Demo,个人不是大牛,遂百度之,总算搞定,现分享如下. 效果图: GIF效果图: 主要是依靠2个DLL文件:ID3.dll 和 Interop.She ...

  5. VB.NET使用TagLib#读取MP3中的ID3v2标签

    Taglib#是一个为.NET开发的元数据读取类库,为一个开源项目,可以在他们的官网上获取windows版本的源码包或者编译好的类库:http://download.banshee.fm/taglib ...

  6. java读取远程url图片,得到宽高

    链接地址:http://blog.sina.com.cn/s/blog_407a68fc0100nrb6.html import java.io.IOException;import java.awt ...

  7. Android应用--简、美音乐播放器获取专辑图片(自定义列表适配器)

    Android应用--简.美音乐播放器获取专辑图片(自定义列表适配器) 2013年7月3日简.美音乐播放器开发 第二阶段已增加功能: 1.歌词滚动显示 2.来电监听 3.音量控制 4.左右滑动切换歌词 ...

  8. Js批量下载花瓣网及堆糖网专辑图片

    插件作者:SaintIC 文章地址:https://blog.saintic.com/blog/256.html 一.安装 1. 安装Tampermonkey扩展,不同浏览器的支持,参见官网:http ...

  9. python中用opencv读取并显示图片

    一.读取并显示图片: import matplotlib.pyplot as plt # plt 用于显示图片 import matplotlib.image as mpimg # mpimg 用于读 ...

随机推荐

  1. MVC中实现Area几种方法

    概述        ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的.如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块 ...

  2. Linux(CentOS 6.7)下配置Mono和Jexus并且部署ASP.NET MVC3、4、5和WebApi(跨平台)

    1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和jexus并且成功部署了asp.net mvc项目,我也是依赖于在网上查找的各种资料来配置环境并且部署项目的,而其在网上也已有 ...

  3. 简单实用的二级树形菜单hovertree

    原创 hovertree是一个仿京东的树形菜单jquery插件,暂时有银色和绿色两种. 官方网址:http://keleyi.com/jq/hovertree/欢迎下载使用 查看绿色效果:http:/ ...

  4. 标准BST二叉搜索树写法

    本人最近被各种数据结构的实验折磨的不要不要的,特别是代码部分,对数据结构有严格的要求,比如写个BST要分成两个类,一个节点类,要给树类,关键是所以操作都要用函数完成,也就是在树类中不能直接操作节点,需 ...

  5. jQuery构造函数init参数分析(一)

    在我的上一篇随笔里面分析了jQuery的构造函数,jQuery对象中有一个原型方法init才是是真正的构造函数,通过init的原型对象跟jQuery的原型对象保持引用关系使得init的实例可以正常调用 ...

  6. powershell对txt文件的服务器进行ping操作

    powershell对txt文件的服务器进行ping操作,txt文件有几百台服务器要进行Ping操作.每行一个 #//***************************************** ...

  7. HotApp小程序统计云后台 免费的Https云后台服务器,方便学习小程序

    小程序学习有些地方需要后台,比如需要存储数据到服务器,比如微信登录. hotapp有免费的小程序云后台 包含基本的 新增,查询,修改,删除 操作,方便于学习,而且不需要微信appid 也可使用. 小程 ...

  8. Android 手机卫士--确认密码对话框编写

    本文接着实现“确认密码”功能,也即是用户以前设置过密码,现在只需要输入确认密码 本文地址:http://www.cnblogs.com/wuyudong/p/5940718.html,转载请注明出处. ...

  9. iOS 10 都有什么改变?

    iOS 10 都有什么改变? 看这一个贴就够了 最全面的试用 苹果在 WWDC 2016 发布会上正式发布了 iOS 10 操作系统,iOS 与 macOS.tvOS 和 watchOS 构建了苹果四 ...

  10. 安装免费的正版Windows10操作系统 - 初学者系列 - 学习者系列文章

    Windows 10操作系统是目前Windows平台最新的操作系统,其相对于其它旧版的操作系统是一个比较成功的操作系统.微软直接使用10版本号,跳过了9版本号进行发布这款操作系统,说明windows ...