Sarah: Tif Bilder auf Vollständigkeit überprüfen

Hallo,

gibt es mit Hilfe eines Free- oder Sharewaretools die Möglichkeit, Tif Bilder auf Vollständigkeit zu prüfen? Oder wie kann man feststellen, ob diese evt. beschädigt sind und ein paar Bits zuwenig enthält? Oder mit Hilfe einer Programmiersprache?

Gruss und Dank
Sarah

  1. Moin Sarah,

    Hallo,

    [...] Tif Bilder auf Vollständigkeit zu prüfen? Oder wie kann man feststellen, ob diese evt. beschädigt sind und ein paar Bits zuwenig enthält? Oder mit Hilfe einer Programmiersprache?

    es geht theoretisch mit PHP. Nur deshalb theoretisch, weil die TIFF Spezifikationen enorm umfangreich sind. Ich hbae so etwas mal ansatzweise programmiert. Das Script liest alle TIFF Dateien in einem Ordner und überprüft diese.

    Achtung jetzt kommt ein laaanges Script:

      
    <?  
      
    set_time_limit(0);  
      
    $Dir='./../data/pc_doc/bad';  
      
    $hDir=opendir($Dir);  
      
    while ( $file = readdir ($hDir) )  
          {  
     $falt=0;  
     $Byte_Read=0;  
     $iRes=0;  
     $Offset=0;  
     $iz=0;  
     $Prev_Tag=0;  
     $XresPos=0;  
     $YresPos=0;  
      
     $IntelMac='';  
      
     $tb=array();  
      
     $ext = strtoupper(strrchr($file, '.'));  
      
     if ( ($file != ".") && ($file != "..") && ($ext == '.TIF') )  
        {  
      $File=sprintf("%s/%s",$Dir,$file);  
      
      $file_size=filesize($File);  
      
      $pointer=@fopen($File,"rb");  
      
      if ( $pointer )  
           {  
       $tb=fread($pointer, 2);  
      
              $IntelMac=$tb[0];  
      
       if ($IntelMac != 'I' && $IntelMac != 'M' )  
          {  
        $falt=2;  
        fclose($pointer);  
        continue;  
          }  
      
       $Byte_Read=$Byte_Read+2;  
      
       #################  
       # Check asterix #  
       #################  
      
       $tb=fread($pointer, 2);  
      
       if ( $IntelMac == 'I' && $tb[0] == '*' && $tb[1] == 0 )  
          $iRes=1;  
      
       if ( $IntelMac == 'M' && $tb[1] == '*' && $tb[0] == 0 )  
          $iRes=1;  
      
       if ($iRes == 0 )  
          {  
        $falt=2;  
        fclose($pointer);  
        continue;  
          }  
      
       $Byte_Read=$Byte_Read+2;  
      
       ###########################  
       # Get offset to first IFD #  
       ###########################  
      
       $Bytes4=fread($pointer, 4);  
      
       $Byte_Read=$Byte_Read+4;  
      
       if ( $IntelMac == 'I' ) # little endian  
          $arr=unpack("Vbyte",$Bytes4);  
       else  
          $arr=unpack("Nbyte",$Bytes4);  
      
       $Offset=$arr[byte];  
      
       if ( $Offset > $file_size )  
          {  
        $falt=3;  
        fclose($pointer);  
        continue;  
          }  
      
       $Skip=$Offset-$Byte_Read;  
      
       if ( $Skip > 0 )  
          {  
        for ( $i=0; $i<$Skip; $i++ )  
            {  
         $dummy=fread($pointer, 1);  
            }  
          }  
      
       $Byte_Read=$Byte_Read+$Skip;  
      
       $get_next=0;  
      
       while ( $get_next == 0 )  
             {  
      
       $iz++;  
      
       $Prev_Tag=0;  
      
       $Bytes2=fread($pointer, 2);  
      
       $Byte_Read=$Byte_Read+2;  
      
       if ( $IntelMac == 'I' ) # little endian  
          $arr=unpack("vbyte",$Bytes2);  
       else  
          $arr=unpack("nbyte",$Bytes2);  
      
       $Entries=$arr[byte];  
      
       if ( $Entries < 1 )  
          {  
        $falt=4;  
        break;  
          }  
      
       for ( $i=0; $i<$Entries; $i++ )  
           {  
        $Bytes2=fread($pointer, 2);  
        $Byte_Read=$Byte_Read+2;  
      
        if ( $IntelMac == 'I' ) # little endian  
           $arr=unpack("vbyte",$Bytes2);  
        else  
           $arr=unpack("nbyte",$Bytes2);  
      
        $Field_Tag=$arr[byte];  
      
        if ( $Prev_Tag > $Field_Tag )  
           {  
         $falt=5;  
         break;  
              }  
      
        $Prev_Tag=$Field_Tag;  
      
        $Bytes2=fread($pointer, 2);  
        $Byte_Read=$Byte_Read+2;  
      
        if ( $IntelMac == 'I' ) # little endian  
           $arr=unpack("vbyte",$Bytes2);  
        else  
           $arr=unpack("nbyte",$Bytes2);  
      
        $Field_Type=$arr[byte];  
      
        if ( $Field_Type < 0 || $Field_Type > 12 )  
           {  
         $falt=6;  
         $break;  
              }  
      
        $Bytes4=fread($pointer, 4);  
        $Byte_Read=$Byte_Read+4;  
      
        if ( $IntelMac == 'I' ) # little endian  
           $arr=unpack("Vbyte",$Bytes4);  
        else  
           $arr=unpack("Nbyte",$Bytes4);  
      
        $Field_Count=$arr[byte];  
      
        if ( $Field_Count < 0 )  
           {  
         $falt=7;  
         $break;  
              }  
      
        $Field_Offset=0;  
        $Field_Offset2=0;  
        $Field_Offset3=0;  
        $Field_Offset4=0;  
      
        $found=0;  
      
        if ( $Field_Type == 1 )  
           {  
         $Bytes4=fread($pointer, 4);  
         $Byte_Read=$Byte_Read+4;  
      
         if ( $IntelMac == 'I' ) # little endian  
            $arr=unpack("Vbyte",$Bytes4);  
         else  
            $arr=unpack("Nbyte",$Bytes4);  
      
         $Field_Offset=$arr[byte];  
         $found=1;  
           }  
      
        if ( $Field_Type == 2 )  
           {  
         $Bytes2=fread($pointer, 2);  
         $Byte_Read=$Byte_Read+2;  
      
         if ( $IntelMac == 'I' ) # little endian  
            $arr=unpack("vbyte",$Bytes2);  
         else  
            $arr=unpack("nbyte",$Bytes2);  
      
         $Field_Offset=$arr[byte];  
      
         $Bytes2=fread($pointer, 2);  
         $Byte_Read=$Byte_Read+2;  
      
         if ( $IntelMac == 'I' ) # little endian  
            $arr=unpack("vbyte",$Bytes2);  
         else  
            $arr=unpack("nbyte",$Bytes2);  
      
         $Field_Offset2=$arr[byte];  
         $found=1;  
           }  
      
        if ( $Field_Type == 4 )  
           {  
         $Buffer=fread($pointer, 1);  
         $Byte_Read=$Byte_Read+1;  
         $Number = ord($Buffer{0}) | (ord($Buffer{1})<<8) | (ord($Buffer{2})<<16) | (ord($Buffer{3})<<24);  
         $Field_Offset=$Number;  
      
         $Buffer=fread($pointer, 1);  
         $Byte_Read=$Byte_Read+1;  
         $Number = ord($Buffer{0}) | (ord($Buffer{1})<<8) | (ord($Buffer{2})<<16) | (ord($Buffer{3})<<24);  
         $Field_Offset2=$Number;  
      
         $Buffer=fread($pointer, 1);  
         $Byte_Read=$Byte_Read+1;  
         $Number = ord($Buffer{0}) | (ord($Buffer{1})<<8) | (ord($Buffer{2})<<16) | (ord($Buffer{3})<<24);  
         $Field_Offset3=$Number;  
      
         $Buffer=fread($pointer, 1);  
         $Byte_Read=$Byte_Read+1;  
         $Number = ord($Buffer{0}) | (ord($Buffer{1})<<8) | (ord($Buffer{2})<<16) | (ord($Buffer{3})<<24);  
         $Field_Offset4=$Number;  
      
         $found=1;  
           }  
      
      
        if ( $found == 0 )  
           {  
         $Bytes4=fread($pointer, 4);  
         $Byte_Read=$Byte_Read+4;  
      
         if ( $IntelMac == 'I' ) # little endian  
            $arr=unpack("Vbyte",$Bytes4);  
         else  
            $arr=unpack("Nbyte",$Bytes4);  
      
         $Field_Offset=$arr[byte];  
           }  
      
        if ( $Field_Type == 1 && $Field_Count > 1 && $Field_Offset > $file_size )  
           {  
         $falt=8;  
         break;  
              }  
      
        if ( $Field_Type == 2 && $Field_Count > 3 && $Field_Offset > $file_size )  
           {  
         $falt=8;  
         break;  
              }  
      
        if ( $Field_Type == 3 && $Field_Count > 1 && $Field_Offset > $file_size )  
           {  
         $falt=8;  
         break;  
              }  
      
        if ( $Field_Type == 4 && $Field_Count > 1 && $Field_Offset > $file_size )  
           {  
         $falt=8;  
         break;  
              }  
      
        if ( $Field_Type == 5 && $Field_Offset > $file_size )  
           {  
         $falt=8;  
         break;  
              }  
      
      
        if ( $Field_Type == 6 && $Field_Count > 1 && $Field_Offset > $file_size )  
           {  
         $falt=8;  
         break;  
              }  
      
        if ( $Field_Type == 7 && $Field_Count > 1 && $Field_Offset > $file_size )  
           {  
         $falt=8;  
         break;  
              }  
      
        if ( $Field_Type == 8 && $Field_Count > 1 && $Field_Offset > $file_size )  
           {  
         $falt=8;  
         break;  
              }  
      
        if ( $Field_Type == 9 && $Field_Count > 1 && $Field_Offset > $file_size )  
           {  
         $falt=8;  
         break;  
              }  
      
        if ( $Field_Type == 10 && $Field_Offset > $file_size )  
           {  
         $falt=8;  
         break;  
              }  
      
        if ( $Field_Type == 11 && $Field_Count > 1 && $Field_Offset > $file_size )  
           {  
         $falt=8;  
         break;  
              }  
      
        if ( $Field_Type == 12 && $Field_Offset > $file_size )  
           {  
         $falt=8;  
         break;  
              }  
      
        if ( $Field_Tag == 258 && $Field_Type == 3 && $Field_Offset != 1 )  
           {  
         $falt=9;  
         break;  
              }  
      
        if ( $Field_Tag == 282 && $Field_Type == 5 )  
           $XresPos=$Field_Offset;  
      
        if ( $Field_Tag == 283 && $Field_Type == 5 )  
           $YresPos=$Field_Offset;  
      
      
        if ( $Field_Tag == 259 && $Field_Type == 3 && $Field_Offset != 4 )  
           {  
         $falt=10;  
         break;  
              }  
      
        if ( $Field_Tag == 257 && $Field_Type == 3 && $Field_Offset < 16 )  
           {  
         $falt=11;  
         break;  
              }  
      
        if ( $Field_Tag == 256 && $Field_Type == 3 && $Field_Offset < 16 )  
           {  
         $falt=12;  
         break;  
              }  
      
           } # End of walk through the entries  
      
       if ( $falt > 0 )  
          break;  
      
       ################  
       # Get next IFD #  
       ################  
      
       $Bytes4=fread($pointer, 4);  
      
       $Byte_Read=$Byte_Read+4;  
      
       if ( $IntelMac == 'I' ) # little endian  
          $arr=unpack("Vbyte",$Bytes4);  
       else  
          $arr=unpack("Nbyte",$Bytes4);  
      
       $Offset=$arr[byte];  
      
       if ( $Offset != 0 )  
          {  
        if ( $Offset > $file_size )  
           {  
         $falt=14;  
         fclose($pointer);  
         break;  
              }  
      
        $Skip=$Offset-$Byte_Read;  
      
        if ( $Skip > 0 )  
           {  
         for ( $i=0; $i<$Skip; $i++ )  
             {  
          $dummy=fread($pointer, 1);  
             }  
           }  
      
        $Byte_Read=$Byte_Read+$Skip;  
      
          }  
       else  
          {  
        $get_next=1;  
          }  
      
      
             } # End of get next  
      
       fclose($pointer);  
      
           } # End of valid pointer  
      else  
         {  
       $falt=1;  
         }  
      
        } # End of is file  
      
    if ( $falt > 0 )  
       {  
        echo 'File ' .$file. ' Error='.$falt.'<br>';  
        $total++;  
       }  
          } # End or read dir  
      
    closedir($hDir);  
      
    echo $total;  
      
    ?>  
    
    

    regds
    Mike©

    --
    Freunde kommen und gehen. Feinde sammeln sich an.
    1. Hallo Mike

      Danke für deine rasche Antwort.

      Ich habe dein Script genommen und den Bildpfad angepasst. Allerdings konnte diese Script tif und png Dateien nicht unterscheiden und gab beidesmal keinen Fehler heraus?

      Oder dient dieser Script "lediglich" darin die Vollständtigkeit von Grafiken zu Überprüfen und nur im Fehlerfall eine Fehlermeldung herauszugeben?

      Merci
      Sarah

      1. Moin Sarah,

        Oder dient dieser Script "lediglich" darin die Vollständtigkeit von Grafiken zu Überprüfen und nur im Fehlerfall eine Fehlermeldung herauszugeben?

        es soll prüfen, ob die Werte für die Pointer und Container richtig sind. Wenn diese Werte korrupt sind, dann wird das TIFF nur fehlerhaft angezeigt. Wie gesagt, es ist nur ein Ansatz, welcher aber zeigt wie des TIFF Format grundsätzlich zu lesen ist.

        regds
        Mike©

        --
        Freunde kommen und gehen. Feinde sammeln sich an.