Mike© : Tif Bilder auf Vollständigkeit überprüfen

Beitrag lesen

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.