电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

图片透明原理VIP免费

图片透明原理_第1页
1/9
图片透明原理_第2页
2/9
图片透明原理_第3页
3/9
半透明原理:假设LCD是256色的。颜色格式为332(RGB)显存中的每一个字节的数据对应一个象素点。在数据写入显存之前,读取相应相素点值,然后与新的数据按一定的规则混合之后,再写入相应像素点的显存。这样主要问题关键是混合算法。混合算法目前在游戏上常用到的算法是AlphaBlend。计算公式如下假设一幅图象是A,另一幅透明的图象是B,那么透过B去看A,看上去的图象C就是B和A的混合图象,设B图象的透明度为alpha(取值为0-1,1为完全透明,0为完全不透明),Alpha混合公式如下:R(C)=(1-alpha)*R(B)+alpha*R(A)G(C)=(1-alpha)*G(B)+alpha*G(A)B(C)=(1-alpha)*B(B)+alpha*B(A)R(x)、G(x)、B(x)分别指颜色x的RGB分量原色值。从上面的公式可以知道,Alpha其实是一个决定混合透明度的数值。应用Alpha混合技术,可以实现游戏中的许多特效,比如火光、烟雾、阴影、动态光源等半透明效果。uC/GUI系统分为好几个层面。简单地可以归结为:1、硬件驱动层2、基本2D图形库3、窗体层次越高,涉及的内容越多,修改的工作量就越大。如果想修改最少的代码实现半透明功能,最好在硬件驱动层找切入口。在硬件驱动层中有个宏定义LCD_WRITE_MEM(Off,data)*((U8*)(DC+(((U32)(Off)))))=(data),从文档可以看到该宏定义的功能就是向显存写入像素点的值。流程如下:a、读取相应象素点值b、与新的象素点值按照混合算法转换。c、将转换结果写入显存对应位置。/设置透明度为0,完全不透明,先执行清屏。GUI_SetBkColor(GUI_WHITE);GUI_SetColor(GUI_WHITE);GUI_Clear();/填充一个方框GUI_SetColor(GUI_RED);GUI_FillRect(0,0,80,30);*****这里设置透明度为80透明之后再执行GUI_SetColor(GUI_GREEN);GUI_FillRect(50,5,200,30);GUI_CONTEXTtypedefstruct{/*VariablesinLCDmodule*/LCD_COLORINDEX_UNIONLCD;LCD_RECTClipRect;U8DrawMode;U8SelLayer;U8TextStyle;U8TransPara;/*VariablesinGLmodule*/GUI_RECT*pClipRect_HL;/*Highlevelcliprectangle...Speedoptimizationsodrawingroutinescanoptimize*/U8PenSize;U8PenShape;U8LineStyle;U8FillStyle;/*VariablesinGUICHARmodule*/constGUI_FONTGUI_UNI_PTR*pAFont;constGUI_UC_ENC_APILIST*pUC_API;/*UnicodeencodingAPI*/I16PLBorder;I16PDispPosX,DispPosY;I16PDrawPosX,DrawPosY;I16PTextMode,TextAlign;GUI_COLORColor,BkColor;/*Requiredonlywhenchangingdevicesandforspeedopt(caching)*//*VariablesinWMmodule*/#ifGUI_WINSUPPORTconstGUI_RECT*WM__pUserClipRect;GUI_HWINhAWin;intxOff,yOff;#endif/*VariablesinMEMDEVmodule(withmemorydevicesonly)*/#ifGUI_SUPPORT_DEVICESconsttLCDDEV_APIList*pDeviceAPI;/*functionpointersonly*/GUI_HMEMhDevData;GUI_RECTClipRectPrev;#endif/*VariablesinAnitaliasingmodule*/#ifGUI_SUPPORT_AAconsttLCD_HL_APIList*pLCD_HL;/*Requiredtoreroutedrawing(HLine&Pixel)totheAAmodule*/U8AA_Factor;U8AA_HiResEnable;#endif}GUI_CONTEXT;包含了整个系统作图的最基本信息。而且这个结构体所声明的变量GUI_Context也是硬件作图层(硬件驱动层)所唯一依赖的变量。在结构体中发现,需要增加透明度信息。于是在结构体中增加一条:U8BlendPara;/混合算法参数Alpha;现在来一个情景分析。1、在画图前设置该变量值。0---100之间。2、在LCD_WRITE_MEM时使用它。这样半透明和透明效果就都实现了。用2D图形库作图测试确实能实现半透明效果。再测试窗体时你会发现一个问题。在基于WM_Window的所有控件上使作半透明效果会出现问题:在反复刷新(即反复产生WM_PAINT)消息时,该窗体的颜色一直在变量,而且由浅及深或由深及浅反复变化实现AlphaBlend混合的代码.主要的算法是:r=(BYTE)((((rForeground-rBackground)*delta)>>ALPHA)+rBackground);g=(BYTE)((((gForeground-gBackground)*delta)>>ALPHA)+gBackground);b=(BYTE)((((bForeground-bBackground)*delta)>>ALPHA)+bBackground);下面是具体实现。(代码可成功运行)//一共2^8+1个等级,0为透明,256为不透明,中间的值为半透明#defineALPHA8#defineFRAMEPENWIDTH2//文本框...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

图片透明原理

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部