分享
分销 收藏 举报 申诉 / 9
播放页_导航下方通栏广告

类型图片透明原理.doc

  • 上传人:pc****0
  • 文档编号:5689348
  • 上传时间:2024-11-15
  • 格式:DOC
  • 页数:9
  • 大小:46KB
  • 下载积分:10 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    图片 透明 原理
    资源描述:
    半透明原理:   假设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_CONTEXT typedef struct { /* Variables in LCD module */ LCD_COLORINDEX_UNION LCD; LCD_RECT ClipRect; U8 DrawMode; U8 SelLayer; U8 TextStyle; U8 TransPara; /* Variables in GL module */ GUI_RECT* pClipRect_HL; /* High level clip rectangle ... Speed optimization so drawing routines can optimize */ U8 PenSize; U8 PenShape; U8 LineStyle; U8 FillStyle; /* Variables in GUICHAR module */ const GUI_FONT GUI_UNI_PTR * pAFont; const GUI_UC_ENC_APILIST * pUC_API; /* Unicode encoding API */ I16P LBorder; I16P DispPosX, DispPosY; I16P DrawPosX, DrawPosY; I16P TextMode, TextAlign; GUI_COLOR Color, BkColor; /* Required only when changing devices and for speed opt (caching) */ /* Variables in WM module */ #if GUI_WINSUPPORT const GUI_RECT* WM__pUserClipRect; GUI_HWIN hAWin; int xOff, yOff; #endif /* Variables in MEMDEV module (with memory devices only) */ #if GUI_SUPPORT_DEVICES const tLCDDEV_APIList* pDeviceAPI; /* function pointers only */ GUI_HMEM hDevData; GUI_RECT ClipRectPrev; #endif /* Variables in Anitaliasing module */ #if GUI_SUPPORT_AA const tLCD_HL_APIList* pLCD_HL; /* Required to reroute drawing (HLine & Pixel) to the AA module */ U8 AA_Factor; U8 AA_HiResEnable; #endif } GUI_CONTEXT; 包含了整个系统作图的最基本信息。而且这个结构体所声明的变量GUI_Context也是硬件作图层(硬件驱动层)所唯一依赖的变量。 在结构体中发现,需要增加透明度信息。   于是在结构体中增加一条:U8 BlendPara;/混合算法参数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为不透明,中间的值为半透明 #define ALPHA 8 #define FRAMEPENWIDTH 2 // 文本框的宽度 #define FRAMECOLOR RGB(192,192,192) // 文本框的颜色 #define SHADOWWIDTH 1 // 阴影的宽度(为了有立体感) #define SHADOWCOLOR RGB(0,0,0) // 阴影的颜色 #define TEXTCOLOR RGB(0,0,192) // 文本的颜色 // 文本框的宽度缺省100像素,宽度、高度可以动态调整 #define DEFAULTOUTPUTWIDTH 100 VOID ShowTransparentText( HWND hDstWnd, // 在那个窗口透明显示 DWORD Alpha, // Alpha通道值(0 < Alpha < 256) COLORREF crForeground, // 文本框底色 LPCTSTR lpszTxt, // 文本 DWORD dwDelayTime // 显示多长时间 ) { COLORREF crBackground; BYTE r, g, b; BYTE rBackground, gBackground, bBackground; BYTE rForeground, gForeground, bForeground; INT x, y; INT nDstPosX, nDstPosY; INT nWidth, nHeight; HDC hWorkDC, hSaveDC, hDstDC; HANDLE hBitmap, hBitmap2; HFONT hf, hfSave; LOGFONT lf; RECT rect; DWORD delta; //创建文本框字体 lf.lfHeight = 14; lf.lfWidth = 0; lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = FW_NORMAL; //FW_BOLD lf.lfItalic = FALSE; lf.lfUnderline = FALSE; lf.lfStrikeOut = 0; lf.lfCharSet = ANSI_CHARSET; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS; _tcscpy(lf.lfFaceName, TEXT("Tahoma")); VERIFY(hf = CreateFontIndirect(&lf)); hDstDC = GetDC(hDstWnd); hWorkDC = CreateCompatibleDC(hDstDC); hfSave = (HFONT)SelectObject(hWorkDC, hf); nWidth = DEFAULTOUTPUTWIDTH; nHeight = DEFAULTOUTPUTWIDTH; SetRect(&rect, 0,0,nWidth,nHeight); DrawText(hWorkDC, lpszTxt, lstrlen(lpszTxt), &rect, DT_CALCRECT|DT_LEFT|DT_WORDBREAK); // 自画立体边框 nWidth = rect.right - rect.left + (FRAMEPENWIDTH + SHADOWWIDTH) * 2; nHeight = rect.bottom - rect.top + (FRAMEPENWIDTH + SHADOWWIDTH) * 2; hBitmap = CreateCompatibleBitmap(hDstDC, nWidth, nHeight); SelectObject(hWorkDC, hBitmap); hSaveDC = CreateCompatibleDC(hDstDC); hBitmap2 = CreateCompatibleBitmap(hDstDC, nWidth, nHeight); SelectObject(hSaveDC, hBitmap2); GetClientRect(hDstWnd, &rect); nDstPosX = rect.left + (rect.right - rect.left - nWidth)/2; nDstPosY = rect.top + (rect.bottom - rect.top - nHeight)/2; BitBlt(hWorkDC, 0, 0, nWidth, nHeight, hDstDC, nDstPosX, nDstPosY, SRCCOPY); BitBlt(hSaveDC, 0, 0, nWidth, nHeight, hDstDC, nDstPosX, nDstPosY, SRCCOPY); delta = Alpha%(1<<ALPHA); // 假若Alpha的值操作256,取模 // 因为0 , 256 对256取模都为0, 但是0为透明,256为不透明 if((0 == delta) && (Alpha == (1<<ALPHA))) { delta = Alpha; } rForeground = GetRValue(crForeground); gForeground = GetGValue(crForeground); bForeground = GetBValue(crForeground); for(y = SHADOWWIDTH + SHADOWWIDTH; y< (nHeight - (SHADOWWIDTH + SHADOWWIDTH)); y++) { for(x = SHADOWWIDTH + SHADOWWIDTH; x < (nWidth - (SHADOWWIDTH + SHADOWWIDTH)); x++) { crBackground = GetPixel(hWorkDC, x, y); rBackground = GetRValue(crBackground); gBackground = GetGValue(crBackground); bBackground = GetBValue(crBackground); r = (BYTE)((((rForeground - rBackground)*delta) >> ALPHA) + rBackground); g = (BYTE)((((gForeground - gBackground)*delta) >> ALPHA) + gBackground); b = (BYTE)((((bForeground - bBackground)*delta) >> ALPHA) + bBackground); SetPixel(hWorkDC, x, y, RGB(r,g,b)); } } // 由于Smartphone不提供FrameRect函数,所以自行实现该功能。 // 画出外框 for(y = 0; y< FRAMEPENWIDTH; y++) { for(x = 0; x < nWidth; x++) { SetPixel(hWorkDC, x, y, FRAMECOLOR); SetPixel(hWorkDC, x, nHeight - y - 1, FRAMECOLOR); } } for(x = 0; x< FRAMEPENWIDTH; x++) { for(y = 0; y < nHeight; y++) { SetPixel(hWorkDC, x, y, FRAMECOLOR); SetPixel(hWorkDC, nWidth - x -1, y, FRAMECOLOR); } } // 画出阴影框 for(y = FRAMEPENWIDTH; y< (FRAMEPENWIDTH+SHADOWWIDTH); y++) { for(x = FRAMEPENWIDTH; x < (nWidth - FRAMEPENWIDTH); x++) { SetPixel(hWorkDC, x, y, SHADOWCOLOR); SetPixel(hWorkDC, x, nHeight - y - 1, SHADOWCOLOR); } } for(x = FRAMEPENWIDTH; x< (FRAMEPENWIDTH+SHADOWWIDTH); x++) { for(y = FRAMEPENWIDTH; y < (nHeight - FRAMEPENWIDTH); y++) { SetPixel(hWorkDC, x, y, SHADOWCOLOR); SetPixel(hWorkDC, nWidth - x -1, y, SHADOWCOLOR); } } // 输出透明字 SetRect(&rect, (FRAMEPENWIDTH+SHADOWWIDTH), (FRAMEPENWIDTH+SHADOWWIDTH), nWidth - (FRAMEPENWIDTH+SHADOWWIDTH), nHeight - (FRAMEPENWIDTH+SHADOWWIDTH)); SetBkMode(hWorkDC, TRANSPARENT); SetTextColor(hWorkDC, TEXTCOLOR); DrawText(hWorkDC, lpszTxt, lstrlen(lpszTxt), &rect, DT_LEFT|DT_WORDBREAK); BitBlt(hDstDC, nDstPosX, nDstPosY, nWidth, nHeight, hWorkDC, 0, 0, SRCCOPY); DeleteObject(SelectObject(hWorkDC, hfSave)); DeleteObject(hBitmap); DeleteDC(hWorkDC); // 延迟制定时间,最好用WaitForSingleObject, 这样用户既可以终止等待,SetEvent即可 // 或者超时,即相当于Sleep功能 Sleep(dwDelayTime); // 恢复原来的背景 BitBlt(hDstDC, nDstPosX, nDstPosY, nWidth, nHeight, hSaveDC, 0, 0, SRCCOPY); DeleteObject(hBitmap2); DeleteDC(hSaveDC); ReleaseDC(hDstWnd, hDstDC); } //wince半透明效果的实现 使用windows ce(5.0以上的版本)的一个api AlphaBlend,用法和BitBlt差不多: BLENDFUNCTION bf; bf.AlphaFormat=0; bf.BlendFlags=0; bf.BlendOp=AC_SRC_OVER; bf.SourceConstantAlpha=100;//透明度0-255 AlphaBlend(hBackDC,0,70,73,20,hMaskDC,0,0,73,20,bf); 可以在WindowsCE里用 #include <wingdi.h> //还要在Project -- setting -- link 里连接上msimg32.lib ////VC用AlphaBlend实现半透明位图 Requirements: Windows NT/2000/XP: Included in Windows 2000 and later. Windows 95/98/Me: Included in Windows 98 and later. Header: Declared in Wingdi.h; include Windows.h. Library: Included as a resource in Msimg32.dll. 示例: 1. void CTestDlg::SaveBitmap(CDC* pDC,CRect rect,CString filename) 2. { 3. CDC* memDC=new CDC; 4. memDC->CreateCompatibleDC(pDC); 5. CBitmap* bmp=new CBitmap; 6. bmp->CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); 7. CBitmap* oldbitmap=memDC->SelectObject(bmp); 8. //此时的bmp就相当于一张桌布,在memDC中画线etc都是画在这张桌布上 9. if(!memDC->BitBlt(0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY)) 10. { 11. AfxMessageBox("BitBlt Error!"); 12. return; 13. } 14. memDC->Ellipse(0,0,100,100); 15. memDC->SelectObject(oldbitmap); 16. 17. BITMAPINFO bi; 18. bi.bmiHeader.biSize=sizeof(bi.bmiHeader); 19. bi.bmiHeader.biWidth=rect.Width(); 20. bi.bmiHeader.biHeight=rect.Height(); 21. bi.bmiHeader.biPlanes=1; 22. bi.bmiHeader.biBitCount=16; 23. bi.bmiHeader.biCompression=BI_RGB; 24. bi.bmiHeader.biSizeImage=0; 25. bi.bmiHeader.biXPelsPerMeter=0; 26. bi.bmiHeader.biYPelsPerMeter=0; 27. bi.bmiHeader.biClrUsed=0; 28. bi.bmiHeader.biClrImportant=0; 29. 30. int bitsize=rect.Width()*rect.Height()*2; 31. BYTE* bits=new BYTE[bitsize]; 32. ::GetDIBits(memDC->m_hDC,*bmp,0,rect.Height(),bits,&bi,DIB_RGB_COLORS); 33.    34. BITMAPFILEHEADER bf; 35. bf.bfType=(int)'M'*256+'B'; 36. bf.bfSize=bitsize;//sizeof(bf); 37. bf.bfOffBits=sizeof(bi.bmiHeader)+sizeof(bf); 38. bf.bfReserved1=0; 39. bf.bfReserved2=0; 40. 41. CFile f(filename,CFile::modeCreate|CFile::modeWrite); 42. f.Write(&bf,sizeof(bf));//注意是先写bf,再写bi 43. f.Write(&bi,sizeof(bi)); 44. f.Write(bits,bitsize); 45. f.Close(); 46. 47. delete[] bits; 48. delete bmp; 49. delete memDC; 50. } 将memDC上的位图半透明覆盖到pDC上 1. BLENDFUNCTION bm; 2. bm.BlendOp=AC_SRC_OVER; 3. bm.BlendFlags=0; 4. bm.SourceConstantAlpha=100; 5. bm.AlphaFormat=0; 6. AlphaBlend(pDC->m_hDC,0,0,rect.Width(),rect.Height(),memDC->m_hDC,0,0,rect.Width(),rect.Height(),bm);
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:图片透明原理.doc
    链接地址:https://www.zixin.com.cn/doc/5689348.html
    pc****0
         内容提供者      已认证 实名认证
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork