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.
Freunde kommen und gehen. Feinde sammeln sich an.