GDI+ gif文件的显示和格式转换

怎么获取gif文件的每一帧,并且显示出来呢?

1.怎么用gid+显示gif文件

总体思路:用Image装载图像,用Graphic显示图像。

相关函数:

(1)Image::FromFile可以从文件中加载一个图像。

可以加载的文件类型有: BMP, GIF, JPEG, PNG, TIFF, and EMF

Image* image = Image::FromFile(_T("res//test.gif"));

(2)Image::GetFrameDimensionsCount 返回一个所谓的“维度”的个数,

每个维 度可能包含多个帧,gif文件就是包含1个维度,然后维度中可能包含

不定数目的帧。

UINT count  = image->GetFrameDimensionsCount();

(3)Image::GetFrameDimensionsList 就是获得这些维度的GUID列表。

先分配count个GUID的数组。

GUID *pDimensionIDs=(GUID*)new GUID[count];
                       image->GetFrameDimensionsList(pDimensionIDs, count);

(4)Image::GetFrameCount获得指定的“维数”有多少帧。

UINT   FrameNums=image->GetFrameCount(&pDimensionIDs[0]);

(5) 获得每帧之间的时间间隔。

PropertyTagFrameDelay是GDI+中预定义的一个GIG属性ID值,表示标

签帧数据的延迟时间。

先调用 Image::GetPropertyItemSize获得有多少个时间间隔属性item.

然后调用Image::GetPropertyItem填充获得的items.

UINT   FrameDelayNums=image->GetPropertyItemSize

(PropertyTagFrameDelay);

PropertyItem *  lpPropertyItem=new  PropertyItem

[FrameDelayNums];

image->GetPropertyItem

(PropertyTagFrameDelay,FrameDelayNums,lpPropertyItem);

时间间隔就保存在PropertyItem的value成员中。

(6)最后,用一个while循环来循环显示每一帧。

Image::SetActiveFrame来设置显示那一帧。

总体的代码如下:

  1. //装载gif文件
  2. Image* image = Image::FromFile(_T("res//test.gif"));
  3. //获得有多少个维度,对于gif就一个维度
  4. UINT count  = image->GetFrameDimensionsCount();
  5. GUID *pDimensionIDs=(GUID*)new GUID[count];
  6. image->GetFrameDimensionsList(pDimensionIDs, count);
  7. TCHAR strGuid[39];
  8. StringFromGUID2(pDimensionIDs[0], strGuid, 39);
  9. UINT frameCount=image->GetFrameCount(&pDimensionIDs[0]);
  10. delete []pDimensionIDs;
  11. //获得这个维度有多少个帧
  12. UINT   FrameNums=image->GetFrameCount(&pDimensionIDs[0]);
  13. //获得各帧之间的时间间隔
  14. //先获得有多少个时间间隔,PropertyTagFrameDelay是GDI+中预定义的一个GIG属性ID值,表示标签帧数据的延迟时间
  15. UINT   FrameDelayNums=image->GetPropertyItemSize(PropertyTagFrameDelay);
  16. PropertyItem *  lpPropertyItem=new  PropertyItem[FrameDelayNums];
  17. image->GetPropertyItem(PropertyTagFrameDelay,FrameDelayNums,lpPropertyItem);
  18. //Guid的值在显示GIF为FrameDimensionTime,显示TIF时为FrameDimensionPage
  19. int    FrameCount=0;
  20. GUID    Guid = FrameDimensionTime;
  21. image->SelectActiveFrame(&Guid,FrameCount);
  22. while(true)
  23. {
  24. Graphics   gh(pDC->GetSafeHdc());
  25. //显示当前帧
  26. gh.DrawImage(image,0,0,image->GetWidth(),image->GetHeight());
  27. //时间间隔
  28. long lPause = ((long*)lpPropertyItem->value)[FrameCount]*10;
  29. Sleep(lPause);
  30. //设置当前需要显示的帧数
  31. if ((FrameCount+1)==FrameNums)
  32. {   //如果已经显示到最后一帧,那么重新开始显示
  33. FrameCount=0;
  34. image->SelectActiveFrame(&Guid,0);
  35. }
  36. else
  37. {
  38. image->SelectActiveFrame(&Guid,++FrameCount);
  39. }
  40. }

2.怎么将gif中的某一帧提取出来,保存为其他的文件格式。

(1) Image::Save函数

                               Status Save(      

                                const WCHAR *filename,
     const CLSID *clsidEncoder,
     const EncoderParameters *encoderParams
);
                 其中第一个参数是表示要保存的文件名称,第二个参数是想采用的编码器,不同
                  的图片格式对应的编码器也不一样。第三个参数设为NULL即可。
             (2)要得到参数2,必须调用函数:
                     Image::GetImageEncodersSize来获得编码器列表
                     Image::GetImageEncoders来获得对应的编码器相关信息(包括CLSID)

              下面是相关的代码:
  1. //获得指定格式的编码器的CLSID
  2. int CTestGifImageDlg::GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
  3. {
  4. UINT  num = 0;          // number of image encoders
  5. UINT  size = 0;         // size of the image encoder array in bytes
  6. ImageCodecInfo* pImageCodecInfo = NULL;
  7. GetImageEncodersSize(&num, &size);
  8. if(size == 0)
  9. return -1;  // Failure
  10. pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
  11. if(pImageCodecInfo == NULL)
  12. return -1;  // Failure
  13. GetImageEncoders(num, size, pImageCodecInfo);
  14. for(UINT j = 0; j < num; ++j)
  15. {
  16. if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
  17. {
  18. *pClsid = pImageCodecInfo[j].Clsid;
  19. free(pImageCodecInfo);
  20. return j;  // Success
  21. }
  22. }
  23. free(pImageCodecInfo);
  24. return -1;  // Failure
  25. }
  26. bool CTestGifImageDlg::DrawGifFrame(CDC *  pDC)
  27. {
  28. //装载gif文件
  29. Image* image = Image::FromFile(_T("res//test.gif"));
  30. //获得有多少个维度,对于gif就一个维度
  31. UINT count  = image->GetFrameDimensionsCount();
  32. GUID *pDimensionIDs=(GUID*)new GUID[count];
  33. image->GetFrameDimensionsList(pDimensionIDs, count);
  34. TCHAR strGuid[39];
  35. StringFromGUID2(pDimensionIDs[0], strGuid, 39);
  36. UINT frameCount=image->GetFrameCount(&pDimensionIDs[0]);
  37. delete []pDimensionIDs;
  38. //获得这个维度有多少个帧
  39. UINT   FrameNums=image->GetFrameCount(&pDimensionIDs[0]);
  40. //将第一帧转换为png图片保存
  41. GUID    Guid = FrameDimensionTime;
  42. image->SelectActiveFrame(&Guid,0);
  43. //保存
  44. CLSID  encoderClsid;
  45. if(GetEncoderClsid(_T("image/png"), &encoderClsid) >= 0)
  46. {
  47. image->Save(_T("pngfiles//test.png"),&encoderClsid,NULL);
  48. }
  49. }

GDI+ gif文件的显示和格式转换的更多相关文章

  1. MATLAB 文件对话框之图片格式转换

    localpathname为当前路径,需要保存图片的位置,根据自己的实际路径设置,usedpathname用来保存打开的文件位置,方便下次打开文件对话框以上次的路径为默认路径. global used ...

  2. Android 读取txt文件并以utf-8格式转换成字符串

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园: 追风917 # 使用EncodingUtils 今天用到了城市选择三级联动的库,用的这个:https://gi ...

  3. 关于MySQL中使用LOAD DATA INFILE导入csv文件时的日期格式问题

    在使用MySQL时,常常会用到Load Data Infile来导入数据,在遇到Date类型的列时,有时会遇到格式转换的问题: 首先创建一张简单的people表,包含名字,生日,年龄三个字段: mys ...

  4. 批量操作文本文件进行dos/unix格式转换

    批量将目录下所有文件进行 dos/unix 格式转换 使用 sed + grep #sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录` eg:  ...

  5. 【VC++技术杂谈007】使用GDI+进行图片格式转换

    本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...

  6. day21 TFRecord格式转换MNIST并显示

    首先简要介绍了下TFRecord格式以及内部实现protobuf协议,然后基于TFRecord格式,对MNIST数据集转换成TFRecord格式,写入本地磁盘文件,再从磁盘文件读取,通过pyplot模 ...

  7. Python3 将configparser从ini文件中读取的内容转换成字典格式

    因为写脚本的用到了,所以研究了下怎么将configparser从ini文件中读取的内容转换成字典格式. 整理一下,希望能对大家有帮助. 从http://stackoverflow.com/questi ...

  8. convert 批量文件的格式转换

    1.将 a.gif 转为 png 格式 convert a.gif a.png 请注意,convert 命令的基本格式为 convert 源文件 [参数] 目标文件 在上面的命令中,源文件是 a.gi ...

  9. 腾讯视频QLV格式转换mp4的方法

    腾讯视频QLV格式转换mp4的方法不知道大家知不知道用?喜欢用腾讯视频的朋友应该都知道腾讯视频单独搞出了个QLV格式文件,只能用腾讯独有的腾讯视频软件才能播放,就算用格式工厂转换也不行,那么腾讯视频的 ...

随机推荐

  1. (笔记)Linux Root下的.gvfs出现异常解决办法

    在linux系统下安装软件或复制文件的时候,复制不成功,出现错误如下: error: failed to stat /home/dade/.gvfs: Permission denied. 表面上看: ...

  2. python2 python3 字符串 编码格式 处理

    使用python的ctypes调用c语言中的函数,传入字符串,打印输出异常.解决方法记录于此. 参考连接: http://blog.csdn.net/u011546806/article/detail ...

  3. 第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作、增、删、改、查

    第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作.增.删.改.查 elasticsearch(搜索引擎)基本的索引 ...

  4. Maven 构建配置文件

    什么是构建配置文件? 生成配置文件是一组可以用来设置或覆盖 Maven 构建配置值的默认值.使用生成配置文件,你可以针对不同的环境,如:生产V/S开发环境自定义构建. 配置文件中指定 pom.xml ...

  5. 成都传智播客java就业班(14.04.01班)就业快报(Java程序猿薪资一目了然)

    这是成都传智播客Java就业班的就业情况,很多其它详情请见成都传智播客官网:http://cd.itcast.cn?140812ls 姓名 入职公司 入职薪资(¥) 方同学 安**软件成都有限公司(J ...

  6. Linux 限制用户远程SSH登录

    通过/etc/hosts.allow和/etc/hosts.deny两个配置文件远程限制某个IP和某段IP地址允许或拒绝访问Linux服务器 SSH.FTP.telnet等服务,其中/etc/host ...

  7. gitlab的安装和基本维护

    基本介绍 GitLab是一个自托管的Git项目仓库,可以自己搭建个人代码管理的仓库,功能与github类似. 安装 操作系统:CentOS6.5 gitlab官网下载安装地址:https://abou ...

  8. R语言igraph 包-构建网络图

    igaph 是一个项目,目标是建立一条简单,易用的网络分析工具,有 R, python, C/C++ 等语言的具体实现: 项目主页: http://igraph.org/ 在R语言中,对应的就是 ig ...

  9. spring + springMVC + spring Data + jpa + maven 项目框架搭建

    首先看一下项目结构: 所用到的jar(pom.xml): <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:x ...

  10. Java读写配置文件——Properties类的简要使用笔记

    任何编程语言都有自己的读写配置文件的方法和格式,Java也不例外. 在Java编程语言中读写资源文件最重要的类是Properties,功能大致如下: 1. 读写Properties文件 2. 读写XM ...