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+
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);
}
IPicture、BITMAP、HBITMAP和CBitmap的关系的更多相关文章
- CBitmap,HBitmap,Bitmap区别及联系
加载一位图,可以使用LoadImage: HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int ...
- C++ CBitmap,HBitmap,Bitmap区别及联系
加载一位图,可以使用LoadImage: HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int ...
- Bitmap、CBitmap、HBITMAP以及BITMAP的相互转换
Bitmap.CBitmap.HBITMAP以及BITMAP的相互转换 构建CBitmapCBitmap bmp;bmp.LoadBitmap(ID); 构建HBITMAPHBitmap = (HBI ...
- CBitmap Detach和DeleteObject的关系
注意:当使用完资源后,必须通过调用函数以释放加速器表.位图.光标.图标以及菜单所占的内存资源: 加速器表:DesteoyAcceleratorTable: 位图:DeleteObj ...
- IPicture总结
1.利用IPicture接口加载.显示图片 IPicture接口管理一个图片对象和它的属性.图片对象提供对Bitmap Icon Metafile的语言不相关的抽象支持.图像对象的主要接口是IPict ...
- 根据图像路径,创建CBitmap对象的方法
因为项目的关系,需要根据图像路径,创建CBitmap对象.起初查资料找到了LoadBitmap这个函数,根据CSDN得 BOOL LoadBitmap ( LPCTSTR lpszResourceNa ...
- 【VS开发】IPicture在指定窗口绘制图
1.利用IPicture接口加载.显示图片 IPicture接口管理一个图片对象和它的属性.图片对象提供对Bitmap Icon Metafile的语言不相关的抽象支持.图像对象的主要接口是IPict ...
- VC++ GDI 总结 一一 CBitmap类
class CBitmap : public CGdiObject { DECLARE_DYNAMIC(CBitmap) public: static CBitmap* PASCAL FromHand ...
- Bitmap: a C++ class
Bitmap: a C++ class The five steps involved to draw a bitmap: Load bitmap using LoadBitmap or ...
随机推荐
- 【BZOJ】【1101】【POI2007】Zap
莫比乌斯反演 PoPoQQQ的讲义例一的一半……好吧这题是那题的基础部分= =很水…… WA了一次:因为没强制类型转换LL /************************************* ...
- 剑指offer--面试题14--收获
按照作者的说法,作为应届毕业生的我来说,如果能写出初级程序员的参考代码来解决面试题14就可认为过关了... 参考代码如下: void ReorderOddEven_1(int *pData, unsi ...
- 写一个函数,实现两个字符串的比较。即实现strcmp函数,s1=s2时返回0,s1!=s2时返回二者第一个不同字符的ASCII值。
#include<stdio.h> #include<stdlib.h> int main(){ setvbuf(stdout,NULL,_IONBF,); ],s2[]; i ...
- java基础知识回顾之javaIO类--File类
File类是对文件系统中文件以及目录(文件夹)进行封装的对象,可以通过面向对象的思想来操作文件和目录(文件夹).File类保存文件或目录的各种元素的信息,包括文件名,文件长度,最后修改日期,是否可读, ...
- hdu 4038 Stone
思路: 如果负数的个数为偶数则不必改变,为奇数就将最大负数变为正: 对于正数,尽量将1,2变为3即可. 代码如下: #include<cstring> #include<iostre ...
- hdu 1329 Hanoi Tower Troubles Again!
找规律的题目an=an-1+(i+i%2)/2*2; ;}
- 欧拉工程第72题:Counting fractions
题目链接:https://projecteuler.net/problem=72 真分数;n/d 当d ≤ 1,000,000时候的真分数有多少个 public class P72{ void run ...
- [转]C++四种cast操作符
http://blog.csdn.net/starryheavens/article/details/4617637 C 风格(C-style)强制转型如下: (T) expression 或 T(e ...
- 【Linux常识篇(1)】所谓的正向代理与反向代理
正向代理的概念 正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连 ...
- 关于Tomcat 6的热部署和热加载
转载:http://blog.csdn.net/tianlincao/article/details/7263840 之前每当修改了类文件,保存后tomcat 都需要自动重启,今天作了后面的设置后,可 ...