说一下原理
先讲jpg 再bmp
怎么捆绑2个图片文件,然后在捆绑一个字符串,
再用VB读取捆绑在一起的文件
能用picturebox显示这2个图片,再读取这个字符串我对文件结构不了解,我打开图片输出开始100个指针的编码,和最后100指针的编码,将其转换成16进制,查阅资料,发现 0xD8是开头,0xD9是结尾,我把一个字符串输入到文件尾,图片仍能正常显示,是不是图像软件读到0xD9就停止了。如果将2个图片以这种方式保存在一起,如何分别读取这2个图片,再如何读取字符串,而且用循环非常卡
谢谢 

解决方案 »

  1.   

    建立一个文件. A.Txt
    A.txt 的前50个字节保存第一个文件的起始位置.
    A.txt 的50-100个字节保存第一个文件的长度.A.txt 的前150个字节保存第二个文件的起始位置.
    A.txt 的150-200个字节保存第二个文件的长度.A.txt 的前250个字节保存字符串的起始位置.
    A.txt 的250-300个字节保存字符串的长度.将二个文件,按起始位置及长度读出来全保存至 A.txt (即全保存至一个文件中,)要读的时候,根据前300个字节的数据读出来.保存至一个临时文件中.
      

  2.   

    试一试:
    1、测出jpg 再bmp再字串的字节数,保存于三个常量里;
    2、以二进制打开一个文件,将上述三项打开,写入打开二进制的文件;关闭。
    3、以二进制打开上述文件,按字节和三个常量读取字节,放入三个Byte数组,然后显示文件和字串。
      

  3.   

    Option ExplicitPrivate Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
    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
      

  4.   

    一、字符串不要直接存储为好,要转换成指定长度的byte数组。
    二、定义好文件头,假设文件头有16个字节,其中4个字节为文件格式标志,再4个字节为jpg二进制数组大小,再4个字节为bmp二进制数组大小,再4个字节为字符串的字长长度。
    三、至于如何如何将jpg或bmp转换成二进制数组,以及如何显示二进制数组的图像数据,可以使用IStream和IPicture接口,我博客里有相关代码。