如何在VC中显示动态的GIF

如果是使用VB,也许这个话题是多余的,因为VB有一个图象控件可以非常容易地实现各种格式的图象显示功能,然而对于VC却没有一个象样的控件可以达到这种效果,怎么办?经过一段日子的研究,发现只需要实现两步工作,就可以在VC中实现如同VB中一样的gif动态效果。

本文将介绍的两部分是IPicture接口的使用和gif的储存格式,好象一听到储存格式,读者就不想再看下去了!其实不然,这里只须用到其最基本的一部分,请读者耐心地往下看。

一.IPicture接口

IPicture接口是一个com类,其成员函数可参见微软的MSDN,这里只需用到以下几个函数:

get_Width 返回当前图像的宽度
get_Height 返回当前图像的高度
Render 在指定的位置、设备上下文上绘制指定的图像

IPicture的使用不需要CoCreateInstance函数,而只需要使用OleLoadPicture,鉴于此接口在许多文章杂志上均有介绍,这里略去(因为不是本文的重点)。

二.Gif储存格式

gif储存格式是一个非常复杂的内容,如果要讲透彻可以写很多篇文章,庆幸的是要实现本文的主题只需要知道其中的一个图象储存结构就可以了,这里定义该图象结构为gifImage:

typedef struct gifImage{
  WORD logX;
  WORD logY;
  WORD width;
  WORD height;
  struct flag{
     BYTE d:3;
     BYTE c:1;
     BYTE b:3;
   BYTE a:1;
  }Flag;
}GifImage,*PGifImage;
在该结构中,

logX为图象相对于逻辑屏幕左上角的x坐标,常为0;

logY为图象相对于逻辑屏幕左上角的y坐标,常为0;

width为图象的宽度;

height为图象的高度;

Flag为一个标志,a指是否存在局域性调色板,b为存储方式(与本主题无关),c为RGB值是否经过排序(无关),d为调色板的大小,为3*2^(d+1);

最后想提一下,因为每副图象都以0x2c开头,并且0x2c前面必为0,故在储存格式中要找到图象的起始位置,只需查找0x2c并且前面一个值为0(具体请看下面代码),其次,一副图象可能储存为多个数据块,每个数据快都是以数据长度为起始的,这一点很重要。即其图象储存为:

0x2c 图象开头
gifImage 图象头结构
BYTE Number Number为一个跟gif压缩有关的数字,可以不理踩。
第一副图象的大小  
...... 图象存储内容
第二副图象大小  
......  
......  
......  
0x00 数据块结束
时间: 2024-10-06 08:01:25

如何在VC中显示动态的GIF的相关文章

如何在VC++中使用API直接打印

(说明:)这一段代码,用以演示<如何在VC++中使用API直接打印>.并且该段代码可以直接嵌入各种工程中,有实际使用的价值. (用途:)在Visual C++中,应用程序通常是使用CView中提供的打印功能,在OnPrint()或OnDraw()中向打印机输出.但是对于对话框中的数据,或基于对话框的程序,打印成了一件繁琐的工作. 该段代码向用户提供了PrintListCtrl()函数,用于打印用户在对话框或FormView中的CListCtrl(控件必须是Report View 形式的)控件中

[WPF疑难]在WPF中显示动态GIF

在我们寻求帮助的时候,最不愿意听到的答复是:很抱歉,在当前版本的产品中还没有实现该功能... 在WPF中显示动态的GIF图像时便遇到了这样的问题,WPF中强大的Image控件却不支持动态的GIF(其只能显示第一帧).当然,我们可以说WPF强大的动画能力,让我们完全有理由抛弃传统的GIF动画,但如某种情况下如果你觉得使用动态的GIF更合适的话(比如QQ表情,因为GIF是利于保存和传输的),没关系,本篇随笔将帮助你解决这个问题. 1,曾有过的尝试: 我们在实际开发过程中也遇到显示动态GIF的问题.发

如何在ZBrush中建模动态漫画面板

  如何在ZBrush中建模动态漫画面板的. 1.从概念开始 我常常使用概念,因为它能让我有更好的想法.鉴于此,我选择了Renan Nuche的一个概念.我首先分析这个概念,找出哪些部位需要额外关注,哪里可以使用对称,又有哪些地方可以走捷径. 2.建模脸部 从脸部开始,我喜欢把大部分精力花在脸上,因为对于人来说,脸几乎是第一眼就能看到的部位,对角色有了大致感觉之后,粗略画出大概的姿势,只是为了对角色有更好的感受. 3.设置动态姿势 接下来需要集中注意力于姿势和角色的对分,我试图在这两个互动的角色

sql-急!!!如何在jsp中显示一个图片集,可以左右滑动的

问题描述 急!!!如何在jsp中显示一个图片集,可以左右滑动的 我现在找到一个插件fotorama,但是不知道怎么在jsp中引用,有大神会用吗? 解决方案 图片集是javascript做的网上有现成的你可以搜Javascript图片集插件就可以了:数据库里一般存放的是图片的路径的. 如果回答对你有帮助请采纳 解决方案二: 用一张表单独存这个图片信息,然后再页面遍历,可以用li标签,左右滑动的效果,可以自己写js算,也可以网上搜现成的 解决方案三: 同意楼上意见.... 解决方案四: 真的不要用数

string-Android应用图标在不同语言模式下如何在launcher中显示不同的名称

问题描述 Android应用图标在不同语言模式下如何在launcher中显示不同的名称 谷歌自带Downloads应用,要在不同的语言模式下显示不同的图标名称,例如:当系统是在中文模式,Downloads应用图标显示的名字是"下载",在英文模式下,应用名称显示的是"downloads",在德文模式下,要显示的名称是"Herunterladen",我在values-de那个目录下的strings.xml文件中修改""Herunt

oracle-如何在jsp中显示保存在Oracle数据库中的图片

问题描述 如何在jsp中显示保存在Oracle数据库中的图片 把图片文件上传时,保存了图片的路径,之后想在另一个页面把图片显示出来, 总是显示不出来,而且不报错, 解决方案 路径的问题,在浏览器上访问以下你所保存的路径,看看在浏览器上能不能正确显示目标图片,如果不能说明路径有问题

如何在wiform中显示一个文件夹中所有图片的缩略图

问题描述 各位大侠:我一菜鸟,请问如何在wiform中显示一个文件夹中所有图片的缩略图 解决方案 解决方案二:看一下GDI方面的知识,很容易解决解决方案三:http://www.ssware.com/megapack/download.htm破解版我們有解决方案四:学习GDI,可以解决的解决方案五:打酱油

textview-如果椭圆的高度大于一行,如何在TextView中显示?

问题描述 如果椭圆的高度大于一行,如何在TextView中显示? 我用的下面的布局来实现,但是没有成功. <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:id="@+id/experienceLayout" android:background="#ffffff" android:layo

C#:如何在picturebox中显示已捕获的视频

问题描述 问题简单描述:现有代码用API实现了先新建一个子窗口,然后在子窗口中实时显示捕获的视频,如何在点击播放buuton后,在同一窗口的picturebox(任何控件都可以)中显示动态视频?(希望能给出代码示例或操作流程)我了解到的办法是:不停保存视频中每一帧的图片,弄一个Timer,不停地加载图片(以较高的频率).但我不知道怎么实现,如果这样做可以的话,希望能给出代码示例或操作流程?问题详述:我已经使用Directshow捕获了视频,并转化为了OpenCV里定义的IplImagege格式.