请教DC和hbitmap关系

liguiman 2009-08-27 12:35:55
兼容DC和hBitmap有什么关系。
进行这样操作 SelectObject(hdc,hBitmap);
操作之后 hBitmap 还和hdc有关系吗? 如果更改hBitmap中内容hdc是否会变?
如果使用bitblt向hdc内拷贝之后,hBitmap是否会变?
如何快速得到hdc内的位图数据部分? 必须要创建兼容bitmap吗?


hBitmap = CreateDIBSection( NULL, ( CONST BITMAPINFO * )&bmih, DIB_RGB_COLORS,
( VOID ** )&pBits, NULL, 0 );
HDC hdc = (CreateCompatibleDC(NULL));
SelectObject(hdc,hBitmap);
...全文
301 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪影 2009-08-27
  • 打赏
  • 举报
回复
兼容DC和hBitmap好比是画室和画布的关系。
你有画室但是没有画布你是画不了画的。

进行这样操作 SelectObject(hdc,hBitmap); //相当于你选择了hBitmap画布
如果使用bitblt向hdc内拷贝之后,hBitmap是否会变? //会改变,相当于你在画室中,在hBitmap画布上画画
如何快速得到hdc内的位图数据部分? //GetBitmapBits、GetDIBits
必须要创建兼容bitmap吗? //不必
MoXiaoRab 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 soyokaze 的回复:]
引用 6 楼 tr0j4n 的回复:
引用 4 楼 soyokaze 的回复:
引用 3 楼 tr0j4n 的回复:
引用 1 楼 tttyd 的回复:
兼容DC和hBitmap好比是画室和画布的关系。
你有画室但是没有画布你是画不了画的。

进行这样操作 SelectObject(hdc,hBitmap); //相当于你选择了hBitmap画布
如果使用bitblt向hdc内拷贝之后,hBitmap是否会变? //会改变,相当于你在画室中,在hBitmap画布上画画
如何快速得到hdc内的位图数据部分?  //GetBitmapBits、GetDIBits
必须要创建兼容bitmap吗?    //不必

LS的真快,这么晚了还在....补充几个。
不创建兼容DC一样可以放个hBitmap没关系的,那个只是为了效率而已
CreateCompatibleBitmap返回的位图对象只包含相应设备描述表中的位图信息头,不包含颜色表和像素数据块。因此,选入该位图对象的设备描述表不能像选入普通对象的设备描述表一样使用,必须在SelectObject函数之后,调用BitBlt将原始设备描述表的颜色表以及像素数据块拷贝到兼容设备描述表。

BitBlt将数据拷贝进了兼容DC之后,其中的内容自然改变了


有些异议。
CreateCompatibleBitmap创建的是DDB,就是设备相关位图,这个“设备”,就是传给它的DC。
DDB的具体数据结构,微软没有明确的文档来描述,但是可以用GetBitmapBits获得。GetBitmapBits得到的是DDB,而GetDIBits是DIB。但是,不管怎样,CreateCompatibleBitmap创建的位图是含有数据块的。
BitBlt可以在不兼容的DC间拷贝BitBlock,如把24位的DDB拷到黑白DDB上,它会自动转换。
还有,BitBlt的全称应该是Bit Boundary Block Transfer,它拷贝的是位块,并不拷贝描述表。描述表如调色板什么的,是属于DC的,与位图是两个概念,不能被BitBlt拷贝,只是控制该DC中位图的颜色。


没有吧....
你的异义:BitBlt的全称应该是Bit Boundary Block Transfer,它拷贝的是位块,并不拷贝描述表
我的原话:BitBlt将原始设备描述表的颜色表以及像素数据块拷贝到兼容设备描述表。
我有说拷贝描述表吗?

你的异义:描述表如调色板什么的,是属于DC的,与位图是两个概念
我的原话:我也不知道你说我的哪句?
我有说是一个概念吗?


你的这句“调用BitBlt将原始设备描述表的颜色表以及像素数据块拷贝到兼容设备描述表。”,颜色表是选入DC的对象,这么说就会让人以为连同DC的某些描述表(即选入DC的对象)一起拷贝了,不是吗?
[/Quote]
囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧
whatabig 2009-08-27
  • 打赏
  • 举报
回复
HDC CreateCompatibleDC(HDC hDC);
hDC represents an existing device context that the memory device context will be compatible with. When hdcMem is returned, a default 1x1(pixel) bitmap also is created and associated with hdcMem and treated as the actual drawing surface.

SelectObject(hdcMem, hbmp)
Associates a bitmap with hdcMem as its drawing surface. From now on, all the subsequenct drawing commands issued onto hdcMem will be effected into hbmp.

只要在电脑上显示,必然要通过硬件,这样就必须先要转换成设备相关的。就是说,只要选入DC,DIB就要转换为和这个DC一致的设备相关位图了。
hbmp could be DDB or DIB bitmap handle, both of them can be selected into hdcMem.
Soyokaze 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liguiman 的回复:]
非常感谢,补充点小问题:
和设备不兼容的dc如何创建?
和指定图片hbitmap一致的DC如何创建呢?(不知道这样说法是否妥当)
就是我产生DC只用于处理图片,而不用显示。
[/Quote]

和设备兼不兼容是指位图而言,DC只是个容器,换句话说就是一堆描述设备属性的变量。位图可以是设备无关的,但是只要在电脑上显示,必然要通过硬件,这样就必须先要转换成设备相关的。就是说,只要选入DC,DIB就要转换为和这个DC一致的设备相关位图了。
Soyokaze 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tr0j4n 的回复:]
引用 4 楼 soyokaze 的回复:
引用 3 楼 tr0j4n 的回复:
引用 1 楼 tttyd 的回复:
兼容DC和hBitmap好比是画室和画布的关系。
你有画室但是没有画布你是画不了画的。

进行这样操作 SelectObject(hdc,hBitmap); //相当于你选择了hBitmap画布
如果使用bitblt向hdc内拷贝之后,hBitmap是否会变? //会改变,相当于你在画室中,在hBitmap画布上画画
如何快速得到hdc内的位图数据部分?  //GetBitmapBits、GetDIBits
必须要创建兼容bitmap吗?    //不必

LS的真快,这么晚了还在....补充几个。
不创建兼容DC一样可以放个hBitmap没关系的,那个只是为了效率而已
CreateCompatibleBitmap返回的位图对象只包含相应设备描述表中的位图信息头,不包含颜色表和像素数据块。因此,选入该位图对象的设备描述表不能像选入普通对象的设备描述表一样使用,必须在SelectObject函数之后,调用BitBlt将原始设备描述表的颜色表以及像素数据块拷贝到兼容设备描述表。

BitBlt将数据拷贝进了兼容DC之后,其中的内容自然改变了


有些异议。
CreateCompatibleBitmap创建的是DDB,就是设备相关位图,这个“设备”,就是传给它的DC。
DDB的具体数据结构,微软没有明确的文档来描述,但是可以用GetBitmapBits获得。GetBitmapBits得到的是DDB,而GetDIBits是DIB。但是,不管怎样,CreateCompatibleBitmap创建的位图是含有数据块的。
BitBlt可以在不兼容的DC间拷贝BitBlock,如把24位的DDB拷到黑白DDB上,它会自动转换。
还有,BitBlt的全称应该是Bit Boundary Block Transfer,它拷贝的是位块,并不拷贝描述表。描述表如调色板什么的,是属于DC的,与位图是两个概念,不能被BitBlt拷贝,只是控制该DC中位图的颜色。


没有吧....
你的异义:BitBlt的全称应该是Bit Boundary Block Transfer,它拷贝的是位块,并不拷贝描述表
我的原话:BitBlt将原始设备描述表的颜色表以及像素数据块拷贝到兼容设备描述表。
我有说拷贝描述表吗?

你的异义:描述表如调色板什么的,是属于DC的,与位图是两个概念
我的原话:我也不知道你说我的哪句?
我有说是一个概念吗?
[/Quote]

你的这句“调用BitBlt将原始设备描述表的颜色表以及像素数据块拷贝到兼容设备描述表。”,颜色表是选入DC的对象,这么说就会让人以为连同DC的某些描述表(即选入DC的对象)一起拷贝了,不是吗?
MoXiaoRab 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 soyokaze 的回复:]
引用 3 楼 tr0j4n 的回复:
引用 1 楼 tttyd 的回复:
兼容DC和hBitmap好比是画室和画布的关系。
你有画室但是没有画布你是画不了画的。

进行这样操作 SelectObject(hdc,hBitmap); //相当于你选择了hBitmap画布
如果使用bitblt向hdc内拷贝之后,hBitmap是否会变? //会改变,相当于你在画室中,在hBitmap画布上画画
如何快速得到hdc内的位图数据部分?  //GetBitmapBits、GetDIBits
必须要创建兼容bitmap吗?    //不必

LS的真快,这么晚了还在....补充几个。
不创建兼容DC一样可以放个hBitmap没关系的,那个只是为了效率而已
CreateCompatibleBitmap返回的位图对象只包含相应设备描述表中的位图信息头,不包含颜色表和像素数据块。因此,选入该位图对象的设备描述表不能像选入普通对象的设备描述表一样使用,必须在SelectObject函数之后,调用BitBlt将原始设备描述表的颜色表以及像素数据块拷贝到兼容设备描述表。

BitBlt将数据拷贝进了兼容DC之后,其中的内容自然改变了


有些异议。
CreateCompatibleBitmap创建的是DDB,就是设备相关位图,这个“设备”,就是传给它的DC。
DDB的具体数据结构,微软没有明确的文档来描述,但是可以用GetBitmapBits获得。GetBitmapBits得到的是DDB,而GetDIBits是DIB。但是,不管怎样,CreateCompatibleBitmap创建的位图是含有数据块的。
BitBlt可以在不兼容的DC间拷贝BitBlock,如把24位的DDB拷到黑白DDB上,它会自动转换。
还有,BitBlt的全称应该是Bit Boundary Block Transfer,它拷贝的是位块,并不拷贝描述表。描述表如调色板什么的,是属于DC的,与位图是两个概念,不能被BitBlt拷贝,只是控制该DC中位图的颜色。
[/Quote]

没有吧....
你的异义:BitBlt的全称应该是Bit Boundary Block Transfer,它拷贝的是位块,并不拷贝描述表
我的原话:BitBlt将原始设备描述表的颜色表以及像素数据块拷贝到兼容设备描述表。
我有说拷贝描述表吗?

你的异义:描述表如调色板什么的,是属于DC的,与位图是两个概念
我的原话:我也不知道你说我的哪句?
我有说是一个概念吗?
liguiman 2009-08-27
  • 打赏
  • 举报
回复
非常感谢,补充点小问题:
和设备不兼容的dc如何创建?
和指定图片hbitmap一致的DC如何创建呢?(不知道这样说法是否妥当)
就是我产生DC只用于处理图片,而不用显示。
Soyokaze 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tr0j4n 的回复:]
引用 1 楼 tttyd 的回复:
兼容DC和hBitmap好比是画室和画布的关系。
你有画室但是没有画布你是画不了画的。

进行这样操作 SelectObject(hdc,hBitmap); //相当于你选择了hBitmap画布
如果使用bitblt向hdc内拷贝之后,hBitmap是否会变? //会改变,相当于你在画室中,在hBitmap画布上画画
如何快速得到hdc内的位图数据部分?  //GetBitmapBits、GetDIBits
必须要创建兼容bitmap吗?    //不必

LS的真快,这么晚了还在....补充几个。
不创建兼容DC一样可以放个hBitmap没关系的,那个只是为了效率而已
CreateCompatibleBitmap返回的位图对象只包含相应设备描述表中的位图信息头,不包含颜色表和像素数据块。因此,选入该位图对象的设备描述表不能像选入普通对象的设备描述表一样使用,必须在SelectObject函数之后,调用BitBlt将原始设备描述表的颜色表以及像素数据块拷贝到兼容设备描述表。

BitBlt将数据拷贝进了兼容DC之后,其中的内容自然改变了
[/Quote]

有些异议。
CreateCompatibleBitmap创建的是DDB,就是设备相关位图,这个“设备”,就是传给它的DC。
DDB的具体数据结构,微软没有明确的文档来描述,但是可以用GetBitmapBits获得。GetBitmapBits得到的是DDB,而GetDIBits是DIB。但是,不管怎样,CreateCompatibleBitmap创建的位图是含有数据块的。
BitBlt可以在不兼容的DC间拷贝BitBlock,如把24位的DDB拷到黑白DDB上,它会自动转换。
还有,BitBlt的全称应该是Bit Boundary Block Transfer,它拷贝的是位块,并不拷贝描述表。描述表如调色板什么的,是属于DC的,与位图是两个概念,不能被BitBlt拷贝,只是控制该DC中位图的颜色。
MoXiaoRab 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tttyd 的回复:]
兼容DC和hBitmap好比是画室和画布的关系。
你有画室但是没有画布你是画不了画的。

进行这样操作 SelectObject(hdc,hBitmap); //相当于你选择了hBitmap画布
如果使用bitblt向hdc内拷贝之后,hBitmap是否会变? //会改变,相当于你在画室中,在hBitmap画布上画画
如何快速得到hdc内的位图数据部分?  //GetBitmapBits、GetDIBits
必须要创建兼容bitmap吗?    //不必
[/Quote]
LS的真快,这么晚了还在....补充几个。
不创建兼容DC一样可以放个hBitmap没关系的,那个只是为了效率而已
CreateCompatibleBitmap返回的位图对象只包含相应设备描述表中的位图信息头,不包含颜色表和像素数据块。因此,选入该位图对象的设备描述表不能像选入普通对象的设备描述表一样使用,必须在SelectObject函数之后,调用BitBlt将原始设备描述表的颜色表以及像素数据块拷贝到兼容设备描述表。

BitBlt将数据拷贝进了兼容DC之后,其中的内容自然改变了
Soyokaze 2009-08-27
  • 打赏
  • 举报
回复
同意1楼。GetBitmapBits是比较老的函数了,已经被GetDIBits取代。

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧