Tif Bilder auf Vollständigkeit überprüfen
Sarah
- grafik
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
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©
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
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©