本帖最后由 swjia8315 于 2012-04-10 15:11:53 编辑

解决方案 »

  1.   

    Private Function sPad(sSrc As String, nSize As Integer, sPadChar As String) As String    If Len(sSrc) < nSize Then
            sPad = String(nSize - Len(sSrc), sPadChar) & sSrc
        Else
            sPad = sSrc
        End If
        
    End FunctionPrivate Sub GetDirectoryEntries(Offset As Long)
     
     Dim No_of_Entries As Long
     Dim Upper_IFDDirectory As Long
     Dim NewDimensions As Long
     Dim Processed_ExifSubIFD As Boolean
     Dim BytesPerComponent As Long
     Dim Offset_to_MakerNote As Long
     Dim i As Long, j As Long
     
     Do
      If IsIntel Then
       No_of_Entries = _
        ExifTemp(Offset + 1) * 256& + _
        ExifTemp(Offset + 0)
      Else
       No_of_Entries = _
        ExifTemp(Offset + 0) * 256& + _
        ExifTemp(Offset + 1)
      End If  On Error Resume Next
      Upper_IFDDirectory = UBound(IFDDirectory)
      On Error GoTo 0
      
      NewDimensions = Upper_IFDDirectory + No_of_Entries
      
      ReDim Preserve IFDDirectory(1 To NewDimensions) As IFD_Data
      
      For i = 1 To No_of_Entries
      
       With IFDDirectory(Upper_IFDDirectory + i)
       
        If IsIntel Then     .Tag_No = _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 1) * 256& + _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 0)
         
         .Data_Format = _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 3) * 256& + _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 2)
          
         .Components = _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 7) * 256& * 256& * 256& + _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 6) * 256& * 256& + _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 5) * 256& + _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 4)
         
         Select Case .Data_Format
         
          Case m_BYTE, m_SBYTE
           BytesPerComponent = 1
           If .Components * BytesPerComponent <= 4 Then
            .value = _
             sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)), 2, "0") & _
             sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 10)), 2, "0") & _
             sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 9)), 2, "0") & _
             sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)), 2, "0")
           Else
            .Offset_To_Value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
            For j = 0 To .Components - 1
             .value = .value & ExifTemp(Offset_to_TIFF + .Offset_To_Value + j)
            Next
           End If
           
          Case m_STRING, m_UNDEFINED
           BytesPerComponent = 1
           If .Components * BytesPerComponent <= 4 Then
            .value = _
             Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)) & _
             Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 10)) & _
             Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 9)) & _
             Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 8))
           Else
            .Offset_To_Value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
            For j = 0 To .Components - 2
             .value = .value & Chr(ExifTemp(Offset_to_TIFF + .Offset_To_Value + j))
            Next
           End If
           
          Case m_SHORT, m_SSHORT
           BytesPerComponent = 2
           If .Components * BytesPerComponent <= 4 Then
            .value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
            '.Value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
           Else
            .Offset_To_Value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
            For j = 0 To .Components - 1
             .value = .value & ExifTemp(Offset_to_TIFF + .Offset_To_Value + j)
            Next
           End If
           
          Case m_LONG, m_SLONG
           BytesPerComponent = 4
           If .Components * BytesPerComponent <= 4 Then
            .value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
           Else
            .Offset_To_Value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
            For j = 0 To .Components - 1
             .value = .value & ExifTemp(Offset_to_TIFF + .Offset_To_Value + j)
            Next
           End If
           
          Case m_RATIONAL, m_SRATIONAL
           BytesPerComponent = 8
           .Offset_To_Value = _
            ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
            ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
            ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
            ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
           .value = _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 3) * 256& * 256& * 256& + _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 2) * 256& * 256& + _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 1) * 256& + _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 0) & _
            "/" & _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 7) * 256& * 256& * 256& + _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 6) * 256& * 256& + _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 5) * 256& + _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 4)
           
         End Select
         
        Else
        
         .Tag_No = _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 0) * 256& + _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 1)
          
         .Data_Format = _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 2) * 256& + _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 3)
          
         .Components = _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 4) * 256& * 256& * 256& + _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 5) * 256& * 256& + _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 6) * 256& + _
          ExifTemp((Offset + 2) + ((i - 1) * 12) + 7)
          
         Select Case .Data_Format
         
          Case m_BYTE, m_SBYTE
           BytesPerComponent = 1
           If .Components * BytesPerComponent <= 4 Then
            .value = _
             sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)), 2, "0") & _
             sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 9)), 2, "0") & _
             sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 10)), 2, "0") & _
             sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)), 2, "0")
           Else
            .Offset_To_Value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
            For j = 0 To .Components - 1
             .value = .value & ExifTemp(Offset_to_TIFF + .Offset_To_Value + j)
            Next
           End If
           
          Case m_STRING, m_UNDEFINED
           BytesPerComponent = 1
           If .Components * BytesPerComponent <= 4 Then
            .value = _
             Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)) & _
             Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 9)) & _
             Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 10)) & _
             Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 11))
           Else
            .Offset_To_Value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
            For j = 0 To .Components - 1
             .value = .value & Chr(ExifTemp(Offset_to_TIFF + .Offset_To_Value + j))
            Next
           End If
                 
      

  2.   

    Case m_SHORT, m_SSHORT
           BytesPerComponent = 2
           If .Components * BytesPerComponent <= 4 Then
            .value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
           Else
            .Offset_To_Value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
            For j = .Components - 1 To 0 Step -1
             .value = .value & ExifTemp(Offset_to_TIFF + .Offset_To_Value + j)
            Next
           End If
           
          Case m_LONG, m_SLONG
           BytesPerComponent = 4
           If .Components * BytesPerComponent <= 4 Then
            .value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
           Else
            .Offset_To_Value = _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
             ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
            For j = 0 To .Components - 1
             .value = .value & ExifTemp(Offset_to_TIFF + .Offset_To_Value + j)
            Next
           End If
           
          Case m_RATIONAL, m_SRATIONAL
           BytesPerComponent = 8
           .Offset_To_Value = _
            ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& * 256& * 256& + _
            ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& * 256& + _
            ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
            ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
           .value = _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 0) * 256& * 256& * 256& + _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 1) * 256& * 256& + _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 2) * 256& + _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 3) & _
            "/" & _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 4) * 256& * 256& * 256& + _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 5) * 256& * 256& + _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 6) * 256& + _
            ExifTemp(Offset_to_TIFF + .Offset_To_Value + 7)
           
         End Select
         
        End If
        
        'Debug.Print Upper_IFDDirectory + i & ".Tag_No: " & .Tag_No & _
         "; .Data_Format: " & .Data_Format & _
         "; .Components: " & .Components & _
         "; .Offset_To_Value: " & .Offset_To_Value & _
         "; .Value: " & .Value
        If .Tag_No = MakerNote Then
         Offset_to_MakerNote = .Offset_To_Value
        End If
        If .Tag_No = ExifOffset Then
         Offset_to_ExifSubIFD = CLng(.value)
         'Debug.Print "Offset_to_ExifSubIFD: " & Offset_to_ExifSubIFD
        End If
        
       End With
       
      Next
      
      If IsIntel Then
       If Not Processed_ExifSubIFD Then
        Offset_to_Next_IFD = _
         ExifTemp(Offset + 2 + (No_of_Entries * 12) + 3) * 256& * 256& * 256& + _
         ExifTemp(Offset + 2 + (No_of_Entries * 12) + 2) * 256& * 256& + _
         ExifTemp(Offset + 2 + (No_of_Entries * 12) + 1) * 256& + _
         ExifTemp(Offset + 2 + (No_of_Entries * 12) + 0)
        'Debug.Print "Offset_to_Next_IFD: " & Offset_to_Next_IFD
       Else
        Offset_to_Next_IFD = 0
       End If
      Else
       If Not Processed_ExifSubIFD Then
        Offset_to_Next_IFD = _
         ExifTemp(Offset + 2 + (No_of_Entries * 12) + 0) * 256& * 256& * 256& + _
         ExifTemp(Offset + 2 + (No_of_Entries * 12) + 1) * 256& * 256& + _
         ExifTemp(Offset + 2 + (No_of_Entries * 12) + 2) * 256& + _
         ExifTemp(Offset + 2 + (No_of_Entries * 12) + 3)
        'Debug.Print "Offset_to_Next_IFD: " & Offset_to_Next_IFD
       Else
        Offset_to_Next_IFD = 0
       End If
      End If
      
      If Offset_to_Next_IFD = 0 And Processed_ExifSubIFD = False Then
       Offset_to_Next_IFD = Offset_to_ExifSubIFD
       Processed_ExifSubIFD = True
      End If
      
      Offset = Offset_to_TIFF + Offset_to_Next_IFD
     
     Loop While Offset_to_Next_IFD <> 0
     
     'If Offset_to_MakerNote <> 0 Then
      'ProcessMakerNote Offset_to_MakerNote + Offset_to_TIFF
     'End If
     
    End SubPrivate Sub ProcessMakerNote(ByVal Offset As Long)
       Dim No_of_Entries As Long
       Dim Upper_IFDDirectory As Long
       Dim NewDimensions As Long
       Dim BytesPerComponent As Long
       Dim i As Long, j As Long
       
       If IsIntel Then
          No_of_Entries = _
            ExifTemp(Offset + 1) * 256& + _
            ExifTemp(Offset + 0)
       Else
          No_of_Entries = _
            ExifTemp(Offset + 0) * 256& + _
            ExifTemp(Offset + 1)
       End If   On Error Resume Next
       Upper_IFDDirectory = UBound(IFDDirectory)
       On Error GoTo 0
       
       NewDimensions = Upper_IFDDirectory + No_of_Entries
       
       ReDim Preserve IFDDirectory(1 To NewDimensions) As IFD_Data
       
       For i = 1 To No_of_Entries
       
          With IFDDirectory(Upper_IFDDirectory + i)
          
            If IsIntel Then           .Tag_No = _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 1) * 256& + _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 0)
                  
               .MakerNote = True
               
               .Data_Format = _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 3) * 256& + _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 2)
                  
               .Components = _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 7) * 256& * 256& * 256& + _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 6) * 256& * 256& + _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 5) * 256& + _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 4)
               
               Select Case .Data_Format
               
                  Case m_BYTE, m_SBYTE
                    BytesPerComponent = 1
                    If .Components * BytesPerComponent <= 4 Then
                       .value = _
                          sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)), 2, "0") & _
                          sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 10)), 2, "0") & _
                          sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 9)), 2, "0") & _
                          sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)), 2, "0")
                    Else
                       .Offset_To_Value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
                       For j = 0 To .Components - 1
                          .value = .value & ExifTemp(Offset_to_TIFF + .Offset_To_Value + j)
                       Next
                    End If
                    
                  Case m_STRING, m_UNDEFINED
                    BytesPerComponent = 1
                    If .Components * BytesPerComponent <= 4 Then
                       .value = _
                          Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)) & _
                          Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 10)) & _
                          Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 9)) & _
                          Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 8))
                    Else
                       .Offset_To_Value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
                       For j = 0 To .Components - 2
                          .value = .value & Chr(ExifTemp(Offset_to_TIFF + .Offset_To_Value + j))
                       Next
                    End If
                                  
      

  3.   

    Case m_SHORT, m_SSHORT
                    BytesPerComponent = 2
                    If .Components * BytesPerComponent <= 4 Then
                       .value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
                       '.Value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
                    Else
                       .Offset_To_Value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
                       For j = 0 To .Components - 1
                          .value = .value & ExifTemp(Offset_to_TIFF + .Offset_To_Value + j)
                       Next
                    End If
                    
                  Case m_LONG, m_SLONG
                    BytesPerComponent = 4
                    If .Components * BytesPerComponent <= 4 Then
                       .value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
                    Else
                       .Offset_To_Value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
                       For j = 0 To .Components - 1
                          .value = .value & ExifTemp(Offset_to_TIFF + .Offset_To_Value + j)
                       Next
                    End If
                    
                  Case m_RATIONAL, m_SRATIONAL
                    BytesPerComponent = 8
                    .Offset_To_Value = _
                       ExifTemp((Offset + 2) + ((i - 1) * 12) + 11) * 256& * 256& * 256& + _
                       ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& * 256& + _
                       ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& + _
                       ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)
                    .value = _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 3) * 256& * 256& * 256& + _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 2) * 256& * 256& + _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 1) * 256& + _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 0) & _
                       "/" & _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 7) * 256& * 256& * 256& + _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 6) * 256& * 256& + _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 5) * 256& + _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 4)
                    
               End Select
               
            Else
            
              .Tag_No = _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 0) * 256& + _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 1)
                  
               .Data_Format = _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 2) * 256& + _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 3)
                  
               .Components = _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 4) * 256& * 256& * 256& + _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 5) * 256& * 256& + _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 6) * 256& + _
                  ExifTemp((Offset + 2) + ((i - 1) * 12) + 7)
                  
               Select Case .Data_Format
               
                  Case m_BYTE, m_SBYTE
                    BytesPerComponent = 1
                    If .Components * BytesPerComponent <= 4 Then
                       .value = _
                          sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)), 2, "0") & _
                          sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 9)), 2, "0") & _
                          sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 10)), 2, "0") & _
                          sPad(Hex(ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)), 2, "0")
                    Else
                       .Offset_To_Value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
                       For j = 0 To .Components - 1
                          .value = .value & ExifTemp(Offset_to_TIFF + .Offset_To_Value + j)
                       Next
                    End If
                    
                  Case m_STRING, m_UNDEFINED
                    BytesPerComponent = 1
                    If .Components * BytesPerComponent <= 4 Then
                       .value = _
                          Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 8)) & _
                          Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 9)) & _
                          Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 10)) & _
                          Chr(ExifTemp((Offset + 2) + ((i - 1) * 12) + 11))
                    Else
                       .Offset_To_Value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
                       For j = 0 To .Components - 1
                          .value = .value & Chr(ExifTemp(Offset_to_TIFF + .Offset_To_Value + j))
                       Next
                    End If
                    
                  Case m_SHORT, m_SSHORT
                    BytesPerComponent = 2
                    If .Components * BytesPerComponent <= 4 Then
                       .value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
                    Else
                       .Offset_To_Value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
                       For j = .Components - 1 To 0 Step -1
                          .value = .value & ExifTemp(Offset_to_TIFF + .Offset_To_Value + j)
                       Next
                    End If
                    
                  Case m_LONG, m_SLONG
                    BytesPerComponent = 4
                    If .Components * BytesPerComponent <= 4 Then
                       .value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
                    Else
                       .Offset_To_Value = _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
                          ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
                       For j = 0 To .Components - 1
                          .value = .value & ExifTemp(Offset_to_TIFF + .Offset_To_Value + j)
                       Next
                    End If  
                  Case m_RATIONAL, m_SRATIONAL
                    BytesPerComponent = 8
                    .Offset_To_Value = _
                       ExifTemp((Offset + 2) + ((i - 1) * 12) + 8) * 256& * 256& * 256& + _
                       ExifTemp((Offset + 2) + ((i - 1) * 12) + 9) * 256& * 256& + _
                       ExifTemp((Offset + 2) + ((i - 1) * 12) + 10) * 256& + _
                       ExifTemp((Offset + 2) + ((i - 1) * 12) + 11)
                    .value = _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 0) * 256& * 256& * 256& + _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 1) * 256& * 256& + _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 2) * 256& + _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 3) & _
                       "/" & _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 4) * 256& * 256& * 256& + _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 5) * 256& * 256& + _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 6) * 256& + _
                       ExifTemp(Offset_to_TIFF + .Offset_To_Value + 7)    
               End Select  
            End If
          End With  
       Next
    End Sub
      

  4.   

    我是LZ,跟帖超过限制只能用另外一个号了内容多,但是都是类文件ExifReader中的内容,直接复制保存即可,,操作语句就是开头几句话,非常方便~~~我的问题是如何把一张照片的exif信息全部删除?经过试验,发现比较奇怪,1.如果exif1.Tag(author) =" ",这样的话如果原来值"abcdef",仅仅是第一位被空格占据,而不是整个字符串被替换为" ",结果就是"bcdef"----这样造成清空这个字段属性必须用类似
    exif1.Tag(author) =space(10)2.即使类似以上方式,给字段值分别用空格取代后,看似exif信息全部清除了,但是当我尝试手工到该jpg图片文件中修改任意一个属性后会提示:一个意外错误是您无法对该文件应用属性,就是不能再修改这个文件的exif信息,这个图片文件相当于不能再动了,非常奇怪!求助有兴趣的朋友大家一起研究。
      

  5.   

    有些图片,比如用CDR生成的JPG图片,使用此类时候出问题:Public Property Get Tag(Optional ByVal ExifTag As EXIF_TAG) As Variant
        If IsLoaded = False And m_file <> "" Then
            Load (m_file)
        ElseIf IsLoaded = False And m_file = "" Then
            Exit Property
        End If
        
        If ExifTag = 0 Then
            On Error Resume Next
            Tag = UBound(IFDDirectory)
            On Error GoTo 0
            Exit Property
        End If
        
        Dim i As Long
        
        For i = 1 To UBound(IFDDirectory)   '这里下标越界
            If IFDDirectory(i).Tag_No = ExifTag Then
                Tag = IFDDirectory(i).value
                Exit For
            End If
        NextEnd Property
      

  6.   

    这个代码 是可以显示 照片拍摄时间 并且修改的!!!
    但是 为何我循环调用    只能显示第一次 load的 图片的 拍照时间有知道解决方案的没啊????????
      

  7.   

    用循环的话,我试过,如下方法可以。
    Dim ex As ExifReader
    For i=1 to 20
        Set ex=Nothing
        Set ex=New ExifReader
        ex.Load("C:/" & i & ".jpg")
        ex.Tag(DateTimeDigitized) = Now  '修改
    Next
    Set ex=Nothing