关于如何在vb读取图像?急

超越_zww 2008-01-10 09:02:13
//这是一视频卡开发包一个ocx方法。
HRESULT OnBufferRemoveNoise([in, out] long * P_Buffer, [in] long P_Len, [in] long P_Width,

[in] long P_Height );

描述

调用CreateRemoveNoiseEvent函数之后会产生一次该事件

获取一个去除噪声点帧buffer,这是线程事件,请小心处理

通常利用这个事件捕获图片

long * P_Buffer 帧buffer,使用时必须强制转换成Byte *

如:

Byte *buffer=(Byte *) P_Buffer;

long P_Len 帧buffer 大小

long P_Width, long P_Height

帧宽度和高度

通常是24bit帧,P_Len= P_Width * P_Height *3
===================================

请问如何在vb中调用此方法,并且在将图像用JPG页格式保存到电脑中.
...全文
289 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lorl2 2008-01-12
  • 打赏
  • 举报
回复
哎,SavePicture那里少填了个变量
lorl2 2008-01-12
  • 打赏
  • 举报
回复

上面这个CopyScreenToBMP的涵数是拷屏的,不是转换的
你可以这样

pBuffer是指向你的图像数据的指针,那么你,在你己知图像长宽的情况下,就可以用CreateDIBSection创建一个与它一样的DIB,然后利用CopyMemory将pBuffer指向的数据拷到DIB中,OleCreatePictureIndirect这个API就可以将这个DIB在内存中转换成VB的StdPicture对像.调用SavePicture方法,就可以直接保存成JPG或BMP了

创建DIB的方法
假设开发包传过来的图像是24位的,320X280,那么可以这样
With BmpInfo
.biBitCount = 24
.biPlanes = 1
.biHeight = 280 '高
.biWidth = 320,宽
.biSize = 40 '本结构长度
End With
hDIB = CreateDIBSection(m_DC, BmpInfo, DIB_RGB_COLORS, pData, 0, 0)

'这时候就得到一个HDIB,但它里面没有内容,pData是指向它的像素数据的指针,
然后我们就可以用CopyMemory将图像写入DIB
CopyMemory pData, pBuffer, pBuffer的字节数
调用下面这个涵数转成VB的StdPicture
dim myPicture as StdPicture
myPicture = CreateBitmapPicture(hDIB, 0, iType)
dim szfile as string
szfile="C:\Test.jpg"
Call SavePicture(szfile)



下面是一段网友写的位图句柄转成StdPicture的代码

Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type

Private Type PicBmp
Size As Long
Type As Long
hBmp As Long
hPal As Long
Reserved As Long
End Type


Private Function CreateBitmapPicture(ByVal hBmp As Long, ByVal hPal As Long, ByVal iType As Integer) As Picture

Dim R As Long, Pic As PicBmp, IPic As IPicture, IID_IDispatch As GUID

'Fill GUID info
With IID_IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With

'Fill picture info
With Pic
.Size = Len(Pic) ' Length of structure
.hBmp = hBmp ' Handle to bitmap
.hPal = hPal ' Handle to palette (may be null)

If iType = 0 Then
.Type = vbPicTypeBitmap ' Type of Picture (bitmap)
Else
.Type = vbPicTypeIcon
End If
End With

'Create the picture
R = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)

'Return the new picture
Set CreateBitmapPicture = IPic

End Function


使用方法:
Set youPicture = CreateBitmapPicture(hBmp, 0, iType)
其中: youPicture 为你要的StdPicture对象
hBmp 为你已得到的位图的句柄
iType 为vbPicTypeBitmap(位图)或 vbPicTypeIcon(图标)





lorl2 2008-01-11
  • 打赏
  • 举报
回复
blog.csdn.net/lorl2
超越_zww 2008-01-11
  • 打赏
  • 举报
回复
lorl2
money
等 级:

==================================
请问为什么我得到的P_buffer转换成图片,黑黑的什么数据都没有.

代码如下:

Private Sub CKDSVideo1_OnBufferRemoveNoise(P_Buffer As Long, ByVal P_Len As Long, ByVal P_Width As Long, ByVal P_Height As Long)
'On Error GoTo Err
' Dim OK As Boolean
'
Dim OK As Boolean

OK = CopyScreenToBMP(App.Path + "\test.bmp", P_Buffer)
If OK Then
Set Picture1.Picture = LoadPicture(App.Path + "\test.bmp")
Else
MsgBox "CAO,拷屏失败了~"
End If

End Sub

Public Function CopyScreenToBMP(ByVal szfile As String, Pbuff As Long) As Boolean
Dim w As Long, h As Long
Dim scrDC As Long
Dim DIB As Long, m_DC As Long
Dim BmpInfo As BITMAPINFOHEADER
Dim BmpFileHead As BITMAPFILEHEADER
Dim pData As Long
Dim buff() As Byte
Dim old As Long
Dim L As Long
'取屏幕 高宽
w = 320
h = 240
'准备内存DC
m_DC = Pbuff
'm_DC = -2073673710
If m_DC = 0 Then
CopyScreenToBMP = False
Exit Function
End If
'填充DIB的BMP结构
With BmpInfo
.biBitCount = 24
.biPlanes = 1
.biHeight = h
.biWidth = w
.biSize = 40 '本结构长度
End With

DIB = CreateDIBSection(m_DC, BmpInfo, DIB_RGB_COLORS, pData, 0, 0)
If DIB = 0 Then
DeleteDC m_DC
CopyScreenToBMP = False
Exit Function
End If

old = SelectObject(m_DC, DIB)
'拷屏
scrDC = GetDC(m_DC)
BitBlt m_DC, 0, 0, w, h, scrDC, 0, 0, SRCCOPY


'补足4的倍数
L = (w * 3 + 3) And &H7FFFFFFC
L = L * h
'分配内存
ReDim buff(1 To L) As Byte


'取像素数据
CopyMemory VarPtr(buff(1)), pData, L

'释放资源
SelectObject m_DC, old
DeleteObject DIB
DeleteDC m_DC
ReleaseDC 0, scrDC
'填充BMPFILE
With BmpFileHead
'BM标志
.bfType(0) = 66: .bfType(1) = 77
.bfSize = 54 + L '本文件大小
.bfOffBits = 54 '像素数据偏移地址
End With

'写入文件
'懒得声明变量,直接用 L 存放文件号
L = FreeFile()
Open szfile For Binary As L
'写入文件头
Put L, 1, BmpFileHead
Put L, , BmpInfo
'写入实际像素
Put L, , buff()
Close L

CopyScreenToBMP = True

End Function
超越_zww 2008-01-11
  • 打赏
  • 举报
回复
lorl2
money
等 级:
发表于:2008-01-11 09:42:134楼 得分:0
创建一个hDIB,然后将buffer复制到DIB里去,然后可以将HDIB转换成StdPicture对像,就可以用SavePciteru方法保存为JPG.要不直接处理HDIB的话,用GDI+也可以,IJL15库也可以压缩,俺BLOG下载的那里那个远程屏幕的代码中,也有一个老外写的纯VB代码JPG算法模块

================================================================
第一次编写这个,不懂啊.

你的BLOG地址多少啊,看看例子.先谢了~
lorl2 2008-01-11
  • 打赏
  • 举报
回复
创建一个hDIB,然后将buffer复制到DIB里去,然后可以将HDIB转换成StdPicture对像,就可以用SavePciteru方法保存为JPG.要不直接处理HDIB的话,用GDI+也可以,IJL15库也可以压缩,俺BLOG下载的那里那个远程屏幕的代码中,也有一个老外写的纯VB代码JPG算法模块
超越_zww 2008-01-11
  • 打赏
  • 举报
回复
大家帮帮忙啊,一客户吹得急.

分不够再加.
cangwu_lee 2008-01-10
  • 打赏
  • 举报
回复
純商業應用哦
超越_zww 2008-01-10
  • 打赏
  • 举报
回复
急啊,明天就要交货了.

大家帮帮忙啊.小弟先感谢大家了~

807

社区成员

发帖
与我相关
我的任务
社区描述
VB 多媒体
社区管理员
  • 多媒体
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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