我已经获得了 mediaplayer 播放窗口的hdc 接下来估计是取图像到内存操作,然后重画,这里怎么取图像?
解决方案 »
- 如何修改txt文件中的内容?
- 什么函数能返回当前程序所在路径
- 如何中断程序?请教各位了
- 请详细说说DataGrid和DBGrid控件有什么区别,在何时何处应该用哪个控件?
- 怎样判断一个数据库中的某个表是否已存在?
- 不用COMMONDIALOG怎样调用选择打印机的对话框?
- 我的dbgrid怎么没有数据源属性呢?
- 如何调出windows的浏览文件夹窗口?
- 哪儿有指纹技术的资料不管什么语言的请告诉我
- 有没有打印预览前可接收打印机名称和纸张型号参数,而后自动按传入的打印机和纸张型号显示预览的打印报表控件
- 讨论向Formula One 6中填充SQL记录集数据的速度问题,VsView7,VSFlexGrid7的注册码
- nik_Amis(Azrael)请进领分
DC已经取得了吗?这时用CreateDIBSection创建DIBSection
用CreateCompatibleDC创建DC
用SelectObject将DIBSection选入DC
将图像BitBlt
根据CreateDIBSection时得到的地址对为图进行操作
BitBlt回去
选出DIBSection
释放DIBSection、DC
Declare Function CreateDIBSection Lib "gdi32" Alias "CreateDIBSection" (ByVal hDC As Long, pBitmapInfo As BITMAPINFO, ByVal un As Long, ByVal lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
说明
创建一个DIBSection。这是一个GDI对象,可象一幅与设备有关位图那样使用。但是,它在内部作为一幅与设备无关位图保存
返回值
Long,执行成功返回DIBSection位图的句柄,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hDC Long,一个设备场景的句柄。如dw设为DIB_PAL_COLORS,那么DIB颜色表就会用来自逻辑调色板的颜色进行初始化
pBitmapInfo BITMAPINFO,这个结构初始化成欲创建的那幅位图的配置数据
un Long,下述常数之一:
DIB_PAL_COLORS BITMAPINFO包含了一个16位调色板索引的数组
DIB_RGB_COLORS BITMAPINFO包含了一个颜色表,其中保存有32位颜色(RGBQUAD)
lplpVoid Long,用于载入DIBSection数据区的内存地址
handle Long,指向一个文件映射对象的可选句柄,位图将在其中创建。如设为零,Windows会自动分配内存
dw Long,如指定了句柄,就用这个参数指定位图数据在文件映射对象中的偏移量
注解
一旦不再需要,记住用DeleteObject函数删除DIBSection位图
如Windows分配了一个内存缓冲区,那么对象删除以后,缓冲区也会自动删除。如指定了一个文件映射对象,则不会自动将其清除
在直接访问DIB内存之前,首先必须保证Windows已完成了绘图(记住,Windows可能对绘图操作进行了排列处理)。通过调用gdiFlush函数,可确保完成所有未决的绘图操作
这里得到的 DC 居然每次都不一样。就是对于相同的hhwnd返回的hhdc值不同想用 GetPixel 取像素值,结果返回总是 -1怎么办??搞不下去了我看了一下 mediaplayer 7.0 ,它本身有视频调节的功能的,但是不知道怎么调用,msdn 里没有介绍又下载了 mediaplayer 7.0 的sdk ,7M 多阿!!居然全是垃圾!!甚至向微软的程序员打听了,居然也不知道晕阿
我也正在做一个这样的程序,但不用VB自带的多媒体控件,是用操作系统自带的一个类,这样就可以更低层的控制,像窗口问题根本就不是问题,几乎豪杰能做到的我也做到了。但就是还有两点:改变亮度做不到;音效处理也做不到。
如果有意交流请EMAIL:
[email protected]
Private Sub CtrlDC(ByVal MyDC As Long)
''用CreateDIBSection创建DIBSection
''用CreateCompatibleDC创建DC
''用SelectObject将DIBSection选入DC
''将图像BitBlt
''根据CreateDIBSection时得到的地址对为图进行操作
''BitBlt回去
''选出DIBSection
''释放DIBSection、DC
'Exit Sub
'-> Compile this code for better performance
Dim bi24BitInfo As BITMAPINFO, bBytes() As Byte, Cnt As Long
With bi24BitInfo.bmiHeader
.biBitCount = 24 '''每像素 3 字节
.biCompression = BI_RGB '''未压缩的格式
.biPlanes = 1
.biSize = Len(bi24BitInfo.bmiHeader)
.biWidth = 352
.biHeight = 288
End With
ReDim bBytes(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 3) As Byte
iDC = CreateCompatibleDC(0)
iBitmap = CreateDIBSection(iDC, bi24BitInfo, DIB_RGB_COLORS, ByVal 0&, ByVal 0&, ByVal 0&)
SelectObject iDC, iBitmap
mm = BitBlt(iDC, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, MyDC, 0, 0, vbSrcCopy)
GetDIBits iDC, iBitmap, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
For Cnt = LBound(bBytes) To UBound(bBytes)
If bBytes(Cnt) < 100 Then
bBytes(Cnt) = 0
Else
bBytes(Cnt) = bBytes(Cnt) - 100
End If
Next Cnt
SetDIBitsToDevice MyDC, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
DeleteDC iDC
DeleteObject iBitmap
End Sub'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''以上是我用来改变mediaplayer.pause 时画面亮度的代码,不起作用。调试后发现 BitBlt 函数运行成功,但是copy到的只是一副黑色的位图!是不是 mediaplayer 显示图像是用的 overlay 方式? 用BitBlt无法正常 copy ??
Private Sub CtrlDC(ByVal MyDC As Long)
''用CreateDIBSection创建DIBSection
''用CreateCompatibleDC创建DC
''用SelectObject将DIBSection选入DC
''将图像BitBlt
''根据CreateDIBSection时得到的地址对为图进行操作
''BitBlt回去
''选出DIBSection
''释放DIBSection、DC
'Exit Sub
'-> Compile this code for better performance
Dim bi24BitInfo As BITMAPINFO, bBytes() As Byte, Cnt As Long
With bi24BitInfo.bmiHeader
.biBitCount = 24 '''每像素 3 字节
.biCompression = BI_RGB '''未压缩的格式
.biPlanes = 1
.biSize = Len(bi24BitInfo.bmiHeader)
.biWidth = 352
.biHeight = 288
End With
ReDim bBytes(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 3) As Byte
iDC = CreateCompatibleDC(0)
iBitmap = CreateDIBSection(iDC, bi24BitInfo, DIB_RGB_COLORS, ByVal 0&, ByVal 0&, ByVal 0&)
SelectObject iDC, iBitmap
mm = BitBlt(iDC, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, MyDC, 0, 0, vbSrcCopy)
GetDIBits iDC, iBitmap, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
For Cnt = LBound(bBytes) To UBound(bBytes)
If bBytes(Cnt) < 100 Then
bBytes(Cnt) = 0
Else
bBytes(Cnt) = bBytes(Cnt) - 100
End If
Next Cnt
SetDIBitsToDevice MyDC, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
DeleteDC iDC
DeleteObject iBitmap
End Sub'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''以上是我用来改变mediaplayer.pause 时画面亮度的代码,不起作用。调试后发现 BitBlt 函数运行成功,但是copy到的只是一副黑色的位图!是不是 mediaplayer 显示图像是用的 overlay 方式? 用BitBlt无法正常 copy ??