1. 程式人生 > >IPicture、BITMAP、HBITMAP和CBitmap的關係

IPicture、BITMAP、HBITMAP和CBitmap的關係

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+  

回答(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實現點陣圖透明顯示

下面是實現中幾個關鍵的地方:

//////////////////////////////////////////////////////////////////////////

////把點陣圖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< P>

{

   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< P>

{

   for(int j=0;j< P>

   {

    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);

}

相關推薦

IPictureBITMAPHBITMAPCBitmap關係

1、有關IPicture載入圖片後直接Render到記憶體DC的問題(HBITMAP 轉換 IPicture) Picture的方法get_Handle可以直接得到圖片的控制代碼 IPicture *pIPicture; HBITMAP hBitmap; ... pIPicture->get_Hand

DrawableBitmapCanvasPaint的關係

首先讓我們理解下Android平臺中的顯示類是View,但是還提供了底層圖形類android.graphics,今天所說的這些均為graphics底層圖形介面。   Bitmap - 稱作點陣圖,一般點陣圖的檔案格式字尾為bmp,當然編碼器也有很多如RGB565、RGB88

【Redis學習筆記三】慢查詢pipeline釋出訂閱BitmapHyperLogLogGEO

目錄 慢查詢 pipeline 釋出訂閱 Bitmap HyperLogLog GEO 慢查詢 生命週期 傳送命令 --> 排隊 --> 執行命令 --> 返回結

android CanvasBitmapPaint

Canvas 畫家、繪製工具 1.drawBitmap /** * bitmap 要繪製的點陣圖物件 * src 要裁切的位置,若是null則

flex中針對ImageBitmapBitmapData相互轉化

flex中針對Image、Bitmap、BitmapData的操作支援非常靈活,簡單整理下: 1、  設定Image元件的source(指定圖片路徑)屬性引入圖片,當圖片載入完成後,Image.content即為Bitmap物件例項 2、  使用資源類的方式[Embed(source=”sample.

伯努利分佈二項分佈Beta分佈多項分佈Dirichlet分佈與他們之間的關係,以及在LDA中的應用

  在看LDA的時候,遇到的數學公式分佈有些多,因此在這裡總結一下思路。 一、伯努利試驗、伯努利過程與伯努利分佈 先說一下什麼是伯努利試驗: 維基百科伯努利試驗中: 伯努利試驗(Bernoulli trial)是隻有兩種可能結果的單次隨機試驗。 即:對於一個隨機變數而言,P(X

IP地址(ABCDE類)網路地址主機地址子網掩碼與閘道器之間的關係

“IP地址”就相當於“電話號碼”,而Internet中的路由器,就相當於電信局的“程控式交換機”。 點分十進位制數表示的IPv4地址被分為幾類,以適應大型、中型、小型的網路。這些類的不同之處在於不同類別的網路地址所佔位數。 **IP地址是一個32位的二進位制數,通常被分

幾張圖看明白VAOVBOEBO的關係程式碼順序

0.詳細教程可看https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/ 1.可以簡單地認為VAO的作用是這樣的: 由於每渲染一次物體就要用一個VBO,而每次繫結一次VBO就要設定各個的頂點的屬性,啟動各個

LoRa關鍵引數 1擴頻因子(SF) 2編位元速率(CR) 3訊號頻寬(BW) 4LoRa訊號頻寬BW符號速率Rs資料速率DR的關係

 LoRa學習:LoRa關鍵引數(擴頻因子,編位元速率,頻寬)的設定及解釋 1、擴頻因子(SF) 2、編位元速率(CR) 3、訊號頻寬(BW) 4、LoRa訊號頻寬BW、符號速率Rs和資料速率DR的關係 5、 LoRa訊號頻寬、擴頻

SQL條件放在onwherehaving的區別關係

參考文章: SQL中ON和WHERE的區別 在寫SQL語句的時候,我們經常會用到各種表連線(left join, right join, inner join, full join),還有各種分組聚合函式(sum, min, max, avg, count),那麼我們在寫SQL的時候

CGIfastcgiWSGIuwsgiuWSGI的關係

1.CGI(Common Gateway Inteface) 通用閘道器介面,是外部應用程式與Web伺服器之間的介面標準,用來規定一個程式該如何與web伺服器程式之間通訊 從而可以讓這個程式跑在web伺服器上。 2.fastcgi fastcgi是Web伺服器(ex:nginx)和語言直

uCOS的軟體定時器uCOS時鐘節拍滴答定時器的關係

uCOS2.81後的版本中有軟體定時器的概念,如果要開啟定時器任務,需要在OS_CFG.H檔案中 #define  OS_TMR_EN                 1 軟體定時器其實跟硬體中斷

==equals()hashcode()的關係區別

==、equals()、hashcode()概念 ==:它的作用是判斷兩個物件的地址是不是相等。即,判斷兩個物件是不試同一個物件。 equals():它的作用也是判斷兩個物件是否相等。但它一般有兩種使用情況:   情況1,類沒有覆蓋equals()方法。則通過equals()比較該類的兩個物件時,等價於

位元組位元的概念關係

1、位(bit) 來自英文bit,音譯為“位元”,表示二進位制位。位是計算機內部資料儲存的最小單位,11010100是一個8位二進位制數。一個二進位制位只可以表示0和1兩種狀態(21);兩個二進位制位可以表示00、01、10、11四種(22)狀態;三位二進位制數可表示八種狀態(23)……

域名瀏覽器HSTSHTTPS的關係

1.瀏覽器的轉換: 大家可以找一個瀏覽器試驗一下,我用的是谷歌的chrome瀏覽器,當你在位址列輸入 baidu.com,然後你再按回車,你發現了什麼? 對,位址列已經把地址自動轉換為  https://www.baidu.com了。這種第一種可能是伺服器的重定向導致的,第二

dubbo中registryroutedirectoryclusterloadbalanceroute的關係以及一個引用操作呼叫操作到底幹了啥

zk是比較典型場景,所以註冊中心都是以zk作為例子的   1 對於registry,提供者沒有這個,消費者才有。為什麼? 因為只有消費者才需要去註冊中心拿到provide的資訊,而provider是不需要關注的,provider只需要去註冊就好。在RegistryProtocol的export方

電腦結構CPU記憶體硬碟三者之間的關係

電腦結構和CPU、記憶體、硬碟三者之間的關係 電腦結構和CPU、記憶體、硬碟三者之間的關係 前面提到了,電腦之父——馮·諾伊曼提出了計算機的五大部件:輸入裝置、輸出裝置、儲存器、運算器和控制器。       我們看一下現在我們電

詳解 HTTPSTLSSSLHTTP區別關係

一、什麼是HTTPS、TLS、SSL HTTPS,也稱作HTTP over TLS。TLS的前身是SSL,TLS 1.0通常被標示為SSL 3.1,TLS 1.1為SSL 3.2,TLS 1.2為SSL 3.3。下圖描述了在TCP/IP協議棧中TLS(各子協議)和HTT

秒懂JS物件構造器函式原型物件之間的關係

一、基本概念   1、物件:屬性和方法的集合,即變數和函式的封裝。每個物件都有一個__proto__屬性,指向這個物件的建構函式的原型物件。   2、構造器函式:用於建立物件的函式,通過new關鍵字生成物件。函式名一般首字母大寫的。   3、原型物件:每個函式都有一個prototype屬性,它是一個指向

Java物件例項的關係Java資料封裝Java繼承多型Java抽象類介面Java靜態欄位方法Java包作用域Java的classpathjarJava核心類

Java物件和例項的關係: 面向物件程式設計(Object-Oriented Programming),是對現實世界建立計算機模型的一種方法。 class是物件的模板,它定義瞭如何建立例項,class的名字就是資料型別。一個class裡可以有多個欄位(field),欄位用