<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    IPicture、BITMAP、HBITMAP和CBitmap的關系

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    1、有關IPicture加載圖片后直接Render到內存DC的問題(HBITMAP轉換IPicture)
    Picture的方法get_Handle可以直接得到圖片的句柄

    IPicture *pIPicture;
    HBITMAP hBitmap;
    ...
    pIPicture->get_Handle((OLE_HANDLE *)&hBitmap);

    2、CBitmap 轉換 HBITMAP
    CBitmap m_bitMap;
    HBITMAP m_hBitMap;
    m_bitMap.LoadBitmap(IDB_BITMAP);
    m_hBitMap=(HBITMAP)m_bitMap.GetSafeHandle();
    3、HBITMAP轉換 CBitmap
    CBitmap cbMMyBitmap;//用來顯示動畫的位圖
    HBITMAP hMMyHBitmap;//用來顯示動畫的位圖的句柄
    BITMAP bMMyBitmapInfo;//位圖信息
    cbMMyBitmap.Attach(hMMyHBitmap);
    cbMMyBitmap.GetBitmap(&bMMyBitmapInfo);
    4、DrawDibDraw和AlphaBlend
    一:這兩個函數都是繪制 DIB 的。
    我在使用過程中發現這兩個函數對于 32 位的位圖,Alpha通道不能正確顯示。就是說,該透明的地方不透明。
    說明一下,位圖沒有問題的,用看圖軟件或PS之類的都可以正確顯示。

    我想問一下,是我的原因還是這兩個函數本來就不支持32位位圖?

    ps.顯示32位位圖可以用AlphaBlend實現的,但是這個函數是繪制場景里的 DDB 的。由于我想顯示的是 DIB,不想轉來轉去的,所以這個函數先不考慮。
    二:StretchDIBits 或 DrawDibDraw 就沒法顯示帶透明屬性的圖片
    要顯示帶透明屬性的圖片只能用別的方法 例如 GDI+
    5、
    回答(1)
    CBitmap::GetBitmap
    回答人:軟界網友 
    回答(2)
    每個成員變量都賦值。
    回答人:軟界網友 
    回答(3)
    CBitmap::GetBitmap是把CBitmap的信息賦給BITMAP結構
    我問的是BITMAP賦給CBitmap
    回答人:軟界網友 
    回答(4)
    創建CBitmap對象時,采用BITMAP指定信息
    回答人:軟界網友 
    回答(5)
    是用構造函數嗎?
    CBitmap::CBitmap(BITMAP bitmap)好像沒有這個構造函數
    回答人:軟界網友 
    回答(6)
    CBitmap::FromHandle(HBITMAP hBitmap )

    回答(7)
    HBITMAP CreateBitmapIndirect(
    CONST BITMAP *lpbm // bitmap data
    );
    6、用GDI實現位圖透明顯示

    下面是實現中幾個關鍵的地方:
    [cpp]
    ////////////////////////////////////////////////////////////////////////// 
    ////把位圖bmpFile的特定矩形區域rtWant上的所有像素的數據讀取到緩沖區pBuf中 
    int CChildView::GetPixFromBmp(CString fileName,CRect rtWant,BYTE *pBuf) 

    BITMAPINFOHEADER headInfo; 
    ZeroMemory(&headInfo,sizeof(headInfo)); 
    int imageHeight; 
    int imageWidth; 
     
    CFile file; 
    file.Open(fileName, CFile::modeRead); 
    file.Seek(14, CFile::begin); 
    file.Read(&headInfo, 40); ///-- 從文件中讀去位圖的BITMAPINFOHEADER信息 
    imageWidth = headInfo.biWidth; 
    imageHeight = headInfo.biHeight; 
    if(headInfo.biBitCount!=32) 

    MessageBox(fileName+"不是32位位圖"); 

     
    for(int i=0;i<rtWant.Height();i++) 

    file.Seek(54+(imageHeight- rtWant.bottom+i)*imageWidth*headInfo.biBitCount/8+rtWant.left*headInfo.biBitCount/8,CFile::begin); 
    file.Read(pBuf+i*rtWant.Width()*headInfo.biBitCount/8,rtWant.Width()*headInfo.biBitCount/8);  

    file.Close(); 
     
    return 0; 

     
    ////////////////////////////////////////////////////////////////////////// 
    //// pDesBuf:目的表面緩沖區,W,H--目的表面的寬和高 
    //// pSrcBuf: 源表面緩沖區 
    //// pRetBuf:結果保存到這個緩沖區中,與pDesBuf兼容 
    //// rtBlend:源表面緩沖區與目的表面緩沖區進行alpha混合的矩形區域 
    //// alpha : 需要透明的百分比,0---完全透明,1 -- 完全不透明 
    void CChildView::MyBlend(BYTE* pDesBuf,BYTE* pSrcBuf,BYTE* pRetBuf,CRect rtBlend,int W,int H,float alpha) 

    memcpy(pRetBuf,pDesBuf,W*H*4); 
    for(int i=0;i<rtBlend.Height();i++) 

    for(int j=0;j<rtBlend.Width();j++) 

    long posDesPix = ((H-rtBlend.bottom+i)*W+rtBlend.left+j)*4; 
    long posSrcPix = (i*rtBlend.Width()+j)*4; 
    pRetBuf[posDesPix+0] = BYTE(pDesBuf[posDesPix+0]*(1-alpha) + pSrcBuf[posSrcPix+0]*(alpha)); 
    pRetBuf[posDesPix+1] = BYTE(pDesBuf[posDesPix+1]*(1-alpha) + pSrcBuf[posSrcPix+1]*(alpha)); 
    pRetBuf[posDesPix+2] = BYTE(pDesBuf[posDesPix+2]*(1-alpha) + pSrcBuf[posSrcPix+2]*(alpha)); 
    pRetBuf[posDesPix+3] = BYTE(pDesBuf[posDesPix+3]*(1-alpha) + pSrcBuf[posSrcPix+3]*(alpha)); 



     

     
    ///-- 設置位圖的BITMAPINFOHEADER信息 
    ZeroMemory(&m_headInfo,sizeof(m_headInfo)); 
    m_headInfo.biSize = sizeof(m_headInfo); 
    m_headInfo.biPlanes = 1; 
    m_headInfo.biBitCount = 32; // 24 
    m_headInfo.biCompression = BI_RGB; 
    m_headInfo.biWidth = m_rtShow.Width(); 
    m_headInfo.biHeight = m_rtShow.Height(); 
    m_headInfo.biSizeImage = m_nLen; 
     

     
    void CChildView::OnPaint()  

    CPaintDC dc(this); // device context for painting 
     
    StretchDIBits(m_MemDC.GetSafeHdc(),0,0,m_rtShow.Width(),m_rtShow.Height(), 
    0,0,m_rtShow.Width(),m_rtShow.Height(),(void*)m_pCurrBuf,(BITMAPINFO*)&m_headInfo,NULL,SRCCOPY); 
     
    dc.BitBlt(m_rtShow.left,m_rtShow.top,m_rtShow.Width(),m_rtShow.Height(), 
    &m_MemDC,0,0,SRCCOPY); 
     

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全