【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2316|回复: 0

[转帖]使用GDI+绘制动态gif图像(带透明背景),调试无误,特贴出代码

[复制链接]
发表于 2007-3-1 16:01:29 | 显示全部楼层 |阅读模式
int bExit;<br/>//此线程函数用来显示gif动画<br/>DWORD WINAPI ThreadProc( LPVOID lpParam ) <br/>{<br/>bExit = 0;//信号量<br/>HWND hwnd = (HWND)lpParam;<br/>HDC hdc = GetDC(hwnd);<br/>Graphics gh(hdc); //hDC是外部传入的画图DC<br/>Image image(L"logo.gif");<br/>if (image.GetLastStatus() != Ok)<br/>return 1;<br/><br/>UINT count = 0;<br/>count = image.GetFrameDimensionsCount();<br/>GUID *pDimensionIDs=(GUID*)new GUID[count];<br/>image.GetFrameDimensionsList(pDimensionIDs, count);<br/>WCHAR strGuid[39];<br/>StringFromGUID2(pDimensionIDs[0], strGuid, 39);<br/>UINT frameCount=image.GetFrameCount(&amp;pDimensionIDs[0]);<br/>delete []pDimensionIDs; <br/>pDimensionIDs = NULL;<br/><br/>UINT size = image.GetPropertyItemSize(PropertyTagFrameDelay);<br/>ropertyItem *pItem = (PropertyItem *)malloc(size);<br/>image.GetPropertyItem(PropertyTagFrameDelay,size,pItem);<br/>//这样就把所有和PropertyTagFrameDelay属性相关的数据取到了pItem中。然后通过pItem访问结构中的value。每两帧图像之间的间隔时间是不一定相同的,所以还需要得到当前正显示的帧图像的索引值。最后调用Image对象的DrawImage函数把每帧图像画出来。简单代码如下:<br/><br/>EncoderParameters encoderParameters;<br/>ULONG parameterValue;<br/>GUID dimension = FrameDimensionTime;<br/><br/>// An EncoderParameters object has an array of<br/>// EncoderParameter objects. In this case, there is only<br/>// one EncoderParameter object in the array.<br/>encoderParameters.Count = 1;<br/><br/>// Initialize the one EncoderParameter object.<br/>encoderParameters.Parameter[0].Guid = EncoderSaveFlag;<br/>encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;<br/>encoderParameters.Parameter[0].NumberOfValues = 1;<br/>encoderParameters.Parameter[0].Value = &amp;parameterValue;<br/><br/>// Get the CLSID of the TIFF encoder.<br/>CLSID encoderClsid;<br/>GetEncoderClsid(L"image/gif", &amp;encoderClsid);//函数GetEncoderClsid在MSDN上有源代码<br/><br/>parameterValue = EncoderValueFrameDimensionPage;<br/><br/>int fcount=0;//当前祯的序号<br/><br/>//Guid的值在显示GIF为FrameDimensionTime,显示TIF时为FrameDimensionPage<br/>GUID Guid = FrameDimensionTime;<br/>long lPause=30;<br/>UINT width = image.GetWidth();<br/>UINT height = image.GetHeight();<br/><br/>ImageAttributes ia;<br/>Color lowColor(0,255,255,255);//白色是透明色<br/>Color highColor(255,255,255,255);<br/>ia.SetColorKey(lowColor,highColor);<br/><br/>IStream* pStream = NULL;<br/>if (::CreateStreamOnHGlobal(NULL, FALSE, &amp;pStream) != S_OK)//用一个IStream对象缓存每一祯的数据<br/>{<br/>return 1;<br/>}<br/><br/>RectF rect(0,20.0,width,height);<br/>LARGE_INTEGER li;<br/>li.QuadPart = 0;<br/><br/>image.SelectActiveFrame(&amp;Guid,0);<br/>image.Save(pStream, &amp;encoderClsid, &amp;encoderParameters);<br/><br/>while(1)<br/>{<br/>Image image1(pStream);<br/>gh.DrawImage(&amp;image1,rect,0,0,width,height,UnitPixel,&amp;ia);<br/><br/>//重新设置当前的活动数据帧<br/>image.SelectActiveFrame(&amp;Guid,fcount++);<br/>if(fcount == frameCount) //frameCount是上面GetFrameCount返回值<br/>fcount= 0; //如果到了最后一帧数据又重新开始<br/>pStream-&gt;Seek(li,STREAM_SEEK_SET,NULL);<br/>image.Save(pStream, &amp;encoderClsid, &amp;encoderParameters);<br/>//计算此帧要延迟的时间<br/>lPause = ((long*)pItem-&gt;value)[fcount]*10;<br/>Sleep(lPause); //这里简单使用了sleep<br/>//::InvalidateRect(hwnd,&amp;rect1,1);<br/>if(bExit)<br/>{<br/>ReleaseDC(hwnd,hdc);<br/>free(pItem);<br/>pStream-&gt;Release();<br/>return 0; <br/>}<br/>}<br/>return 0;<br/>}<br/><script language="javascript" src="/js/googlehead.js"></script><script type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 04:11

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表