说一下原理
先讲jpg 再bmp
怎么捆绑2个图片文件,然后在捆绑一个字符串,
再用VB读取捆绑在一起的文件
能用picturebox显示这2个图片,再读取这个字符串我对文件结构不了解,我打开图片输出开始100个指针的编码,和最后100指针的编码,将其转换成16进制,查阅资料,发现 0xD8是开头,0xD9是结尾,我把一个字符串输入到文件尾,图片仍能正常显示,是不是图像软件读到0xD9就停止了。如果将2个图片以这种方式保存在一起,如何分别读取这2个图片,再如何读取字符串,而且用循环非常卡
谢谢
先讲jpg 再bmp
怎么捆绑2个图片文件,然后在捆绑一个字符串,
再用VB读取捆绑在一起的文件
能用picturebox显示这2个图片,再读取这个字符串我对文件结构不了解,我打开图片输出开始100个指针的编码,和最后100指针的编码,将其转换成16进制,查阅资料,发现 0xD8是开头,0xD9是结尾,我把一个字符串输入到文件尾,图片仍能正常显示,是不是图像软件读到0xD9就停止了。如果将2个图片以这种方式保存在一起,如何分别读取这2个图片,再如何读取字符串,而且用循环非常卡
谢谢
解决方案 »
- VB 出现错误,不能打开数据库 <name>。它可能不是一个应用程序所能识别的数据库,或是文件?
- setup factory 我用到了ACCESS 数据库 出现run_time error '3706' ado 找不到指定的提供者 如何解决呢
- ado中如和取消筛选
- RegCreateKey 修改注册表权限问题
- VB2008+SQL SERVER,客户端连不上数据库。
- 请如何使用WININET(api)或Internet Transfer(控件)
- 请教各位一个sql server的问题,急!!!
- ERP源程序出售VB,Sql2000
- 在CSDN上如何删除我的参与中的某些帖子?不给分有人回答吗?
- 请教各位大侠?应该如何学好VB,做个专业的VB程序员,谢了。
- vb如何读取文本的字符
- 关于vb调用带输出参数的存储过程的问题
A.txt 的前50个字节保存第一个文件的起始位置.
A.txt 的50-100个字节保存第一个文件的长度.A.txt 的前150个字节保存第二个文件的起始位置.
A.txt 的150-200个字节保存第二个文件的长度.A.txt 的前250个字节保存字符串的起始位置.
A.txt 的250-300个字节保存字符串的长度.将二个文件,按起始位置及长度读出来全保存至 A.txt (即全保存至一个文件中,)要读的时候,根据前300个字节的数据读出来.保存至一个临时文件中.
1、测出jpg 再bmp再字串的字节数,保存于三个常量里;
2、以二进制打开一个文件,将上述三项打开,写入打开二进制的文件;关闭。
3、以二进制打开上述文件,按字节和三个常量读取字节,放入三个Byte数组,然后显示文件和字串。
Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ppstm As Any) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function OleLoadPicture Lib "olepro32" (pStream As Any, ByVal lSize As Long, ByVal fRunmode As Long, riid As Any, ppvObj As Any) As LongPrivate Sub CombineFile(JpgPath As String, BmpPath As String, Str As String, FileName As String)
Dim JpgLen As Long
Dim BmpLen As Long
Dim StrLen As Long
Dim FileNumberRead As Long
Dim FileNumberWrite As Long
Dim Data() As Byte
JpgLen = FileLen(JpgPath)
BmpLen = FileLen(BmpPath)
StrLen = LenB(StrConv(Str, vbUnicode))
FileNumberWrite = FreeFile
Open FileName For Binary As #FileNumberWrite
Put #FileNumberWrite, , JpgLen
Put #FileNumberWrite, , BmpLen
Put #FileNumberWrite, , StrLen
FileNumberRead = FreeFile
ReDim Data((JpgLen) - 1)
Open JpgPath For Binary As #FileNumberRead
Get #FileNumberRead, 1, Data
Put #FileNumberWrite, , Data
Close #FileNumberRead
FileNumberRead = FreeFile
ReDim Data((BmpLen) - 1)
Open BmpPath For Binary As #FileNumberRead
Get #FileNumberRead, 1, Data
Put #FileNumberWrite, , Data
Close #FileNumberRead
Data = StrConv(Str, vbFromUnicode)
Put #FileNumberWrite, , Data
Close #FileNumberWrite
End SubPrivate Sub ReadFile(FileName As String, Jpg As StdPicture, Bmp As StdPicture, Str As String)
Dim JpgLen As Long
Dim BmpLen As Long
Dim StrLen As Long
Dim FileNumberRead As Long
Dim Data() As Byte FileNumberRead = FreeFile
Open FileName For Binary As #FileNumberRead
Get #FileNumberRead, , JpgLen
Get #FileNumberRead, , BmpLen
Get #FileNumberRead, , StrLen
ReDim Data(JpgLen - 1)
Get #FileNumberRead, , Data
Set Jpg = ArrayToPicture(Data)
ReDim Data(BmpLen - 1)
Get #FileNumberRead, , Data
Set Bmp = ArrayToPicture(Data)
ReDim Data(StrLen - 1)
Get #FileNumberRead, , Data
Str = StrConv(Data, vbUnicode)
Close #FileNumberRead
End Sub
Private Function ArrayToPicture(Data() As Byte) As IPicture
On Error Resume Next
Dim MemoryHandle As Long
Dim LockMemory As Long
Dim GUID(0 To 3) As Long
Dim Size As Long
Dim IIStream As IUnknown
GUID(0) = &H7BF80980
GUID(1) = &H101ABF32
GUID(2) = &HAA00BB8B
GUID(3) = &HAB0C3000
Size = UBound(Data) - LBound(Data) + 1
MemoryHandle = GlobalAlloc(&H2, Size) '从堆中分配指定数量字节的一整块,这时系统无法提供零零碎碎的局部或全局的堆
If MemoryHandle <> 0 Then 'MemoryHandle <> 0 说明我们创建成功了
LockMemory = GlobalLock(MemoryHandle) '锁定全局内存对象并返回它的首地址,LockMemory就是首地址
If LockMemory <> 0 Then 'LockMemory <> 0标识锁定成功
CopyMemory ByVal LockMemory, Data(0), Size '把我们的数据拷贝倒这个堆中
Call GlobalUnlock(MemoryHandle) 'GlobalUnlock函数把以GMEM_MOVEABLE方式分配的内存对象的锁定计数器减1
If CreateStreamOnHGlobal(MemoryHandle, 1, IIStream) = 0 Then '从全局内存中创建stream对象,第二个参数为1表示当stream释放时自动释放全局内存
'创建一个新的picture对象并用stream对象中的内容初始化,OleLoadPicture是COM中的函数
Call OleLoadPicture(ByVal ObjPtr(IIStream), 0, 0, GUID(0), ArrayToPicture)
End If
End If
End If
End FunctionPrivate Sub CmdWriteClick()
End SubPrivate Sub CmdRead_Click()
Dim Jpg As StdPicture
Dim Bmp As StdPicture
Dim Str As String
ReadFile App.Path & "\1.dtx", Jpg, Bmp, Str
Picture1.Picture = Jpg
Picture2.Picture = Bmp
Me.Caption = Str
End SubPrivate Sub CmdWrite_Click()
CombineFile App.Path & "\1.jpg", App.Path & "\1.bmp", "我是laviewpt", App.Path & "\1.dtx"
End Sub
二、定义好文件头,假设文件头有16个字节,其中4个字节为文件格式标志,再4个字节为jpg二进制数组大小,再4个字节为bmp二进制数组大小,再4个字节为字符串的字长长度。
三、至于如何如何将jpg或bmp转换成二进制数组,以及如何显示二进制数组的图像数据,可以使用IStream和IPicture接口,我博客里有相关代码。