tag:blogger.com,1999:blog-24925990276684397612024-03-13T20:58:37.523+01:00Art1Pirat BlogÜber Scannen, OCR, Digitalisierung alter Bücher, Bildalgorithmen, Ebooks und mehr...Unknownnoreply@blogger.comBlogger63125tag:blogger.com,1999:blog-2492599027668439761.post-9146779920678059852021-11-27T19:45:00.000+01:002021-11-27T19:45:27.670+01:00Brandgefährliche Technik<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-h_LoZCVoc7I/YaJ6JvXOqvI/AAAAAAAAHDA/8atQ0bY_cG049OrWcG7zhhoGuHc4xMceQCPcBGAsYHg/s2560/IMG_20211127_192238_560.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1920" data-original-width="2560" height="240" src="https://1.bp.blogspot.com/-h_LoZCVoc7I/YaJ6JvXOqvI/AAAAAAAAHDA/8atQ0bY_cG049OrWcG7zhhoGuHc4xMceQCPcBGAsYHg/s320/IMG_20211127_192238_560.jpg" width="320" /></a></div>Anbei das Steckernetzteil eines DVBSky USB S2 TV-Adapters nach dem Einstecken in eine Steckdosenleiste. Die Bilder sprechen für sich.<div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-JbCYLWby45A/YaJ6Jmh0QLI/AAAAAAAAHDA/Mq5NX9X2uokzOHzLFag9HllqB_WIQddwgCPcBGAsYHg/s4608/IMG_20211127_192300_529.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="4608" data-original-width="3456" height="200" src="https://1.bp.blogspot.com/-JbCYLWby45A/YaJ6Jmh0QLI/AAAAAAAAHDA/Mq5NX9X2uokzOHzLFag9HllqB_WIQddwgCPcBGAsYHg/w150-h200/IMG_20211127_192300_529.jpg" width="150" /></a></div><p></p><p><br /><br /><br /><br /> </p><p> </p><p> </p><p> </p><p>Das Netzteil ist angeblich CE geprüft.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-AHmKyLRciFE/YaJ6Jg6pywI/AAAAAAAAHDA/pNlKM9cSWzgyJwfAyvn9F7OTwAGU7uyEACPcBGAsYHg/s2560/IMG_20211127_192338_988.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="2560" data-original-width="1920" height="320" src="https://1.bp.blogspot.com/-AHmKyLRciFE/YaJ6Jg6pywI/AAAAAAAAHDA/pNlKM9cSWzgyJwfAyvn9F7OTwAGU7uyEACPcBGAsYHg/s320/IMG_20211127_192338_988.jpg" width="240" /></a></div><p></p><p>Wie man in den Bildern sieht, konnte der Netzspannung führende Stift ungeschützt und direkt auf den Kühlkörper treffen.</p><p></p><p>Fehlerursache war die in der Mitte zwischen dem Stecker geführte Schraube, die in eine Plastehülse des äußeren Gehäuses führen sollte, dort aber ausgebrochen ist.</p><p>Der Stick ist vermutlich ebenfalls hinüber, glücklicherweise kam es zu keinem Brand und der PC und die Sat-Anlage wurden nicht beschädigt.</p><p>Dennoch, wie kann man so einen Murks fabrizieren? :(<br /></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-bUFdhyRIWiA/YaJ62ATxueI/AAAAAAAAHDM/igwSuM1jvSI6RocTycyEwobYmG9BM7qqACPcBGAsYHg/s4608/IMG_20211127_193516_439.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="4608" data-original-width="3456" height="320" src="https://1.bp.blogspot.com/-bUFdhyRIWiA/YaJ62ATxueI/AAAAAAAAHDM/igwSuM1jvSI6RocTycyEwobYmG9BM7qqACPcBGAsYHg/s320/IMG_20211127_193516_439.jpg" width="240" /></a><a href="https://1.bp.blogspot.com/-IC_4N1Rw4uM/YaJ6JrzS53I/AAAAAAAAHDA/Nw20HQwRaUc6oljGBfusS59HfP4HB6yRQCPcBGAsYHg/s2560/IMG_20211127_192244_181.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1920" data-original-width="2560" height="240" src="https://1.bp.blogspot.com/-IC_4N1Rw4uM/YaJ6JrzS53I/AAAAAAAAHDA/Nw20HQwRaUc6oljGBfusS59HfP4HB6yRQCPcBGAsYHg/s320/IMG_20211127_192244_181.jpg" width="320" /></a></div><br /></div><p></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-35614250912541243392019-11-13T15:45:00.002+01:002019-11-13T17:06:07.522+01:00Improve md5 calculation -- an unexpected journeyIn a project it was necessary to calculate the md5 checksums of files as fast as possible. Under Perl5 there is the module <a href="https://metacpan.org/pod/Digest::MD5">Digest::MD5</a>.<br />
<br />
The suggested way to use this module is not the fastest. The reason is that the method addfile() does not use the buffer optimally. <br />
<br />
In the following I have tested all possible variants: the suggested addfile approach, the buffer optimized, the <a href="https://metacpan.org/pod/File::Map">File::Map</a> based and the system call to 'md5sum' variant:<br />
<br />
<code lang="perl">
</code>
<br />
<pre><code lang="perl">#!/usr/bin/env perl
# bench to check how fast is memory mapped access
use strict;
use warnings;
use utf8;
use Benchmark qw(:all) ;
use File::Map qw( map_file);
use Digest::MD5;
use File::Slurp;
sub md5offile_mapped {
my $fn = shift;
map_file my $data, $fn, '<';
my $md5obj = Digest::MD5->new;
$md5obj->add($data);
return $md5obj->hexdigest;
}
sub md5offile_orig {
my $fn = shift;
my $fh;
open($fh, '<', $fn) || die ("Can't open '$fn', $!");
binmode($fh);
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks)
= stat $fh;
my $buffer;
my $md5obj = Digest::MD5->new;
while (read($fh, $buffer, $blksize)) {
$md5obj->add($buffer);
}
close $fh || die ("could not close file '$fn', $!");
return $md5obj->hexdigest;
}
sub md5offile_addfile {
my $fn = shift;
my $fh;
open($fh, '<', $fn) || die ("Can't open '$fn', $!");
binmode($fh);
my $md5obj = Digest::MD5->new;
$md5obj->addfile( $fh );
close $fh || die ("could not close file '$fn', $!");
return $md5obj->hexdigest;
}
</code><code lang="perl">sub md5offile_md5file {
my $fn = shift;
return system("md5sum $fn >/dev/null 2>&1");
}
my $file = shift @ARGV;
read_file($file); # to warm cache
timethese(500, {
'memory_mapped' => sub{ md5offile_mapped( $file ); },
'original' => sub{ md5offile_orig( $file ); },
'add_file' => sub{ md5offile_addfile( $file ); },
'system' => sub{ md5offile_md5file( $file ); },
;}
);
</code></pre>
<code lang="perl">
</code>
<br />
<br />
<br />
<br />
The variant "<i>memory-mapped</i>" is about 10% faster than the others. Here a result for checksumming a DNG-file with size of 13MB on a NVME device:<br />
<br />
<pre>Benchmark: timing 500 iterations of add_file, memory_mapped, original, system...
add_file: 12 wallclock secs (10.68 usr + 1.09 sys = 11.77 CPU) @ 42.48/s (n=500)
memory_mapped: 10 wallclock secs (10.43 usr + 0.23 sys = 10.66 CPU) @ 46.90/s (n=500)
original: 12 wallclock secs (10.98 usr + 0.95 sys = 11.93 CPU) @ 41.91/s (n=500)
system: 16 wallclock secs ( 0.13 usr 0.27 sys + 13.97 cusr 1.34 csys = 15.71 CPU) @ 31.83/s (n=500)
</pre>
<br />
<br />
Unfortunately there is a problem with large files. The Digest::MD5 probably calculates the values wrong for scalars >1GB (see <a href="https://rt.cpan.org/Public/Bug/Display.html?id=123185">https://rt.cpan.org/Public/Bug/Display.html?id=123185</a>). In this case, the memory mapped approach should not be used.Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-36105494628044865702019-05-14T15:00:00.002+02:002019-05-14T15:00:33.970+02:00Asciiart via Perl komprimierenAls kleine Fingerübung habe ich ff. Perl-Script geschrieben, welches zur "Komprimierung" von AsciiArt verwendet werden kann.<br />
<br />
Sei die Vorlage:<br />
<br />
<pre> /| |\
, ( `-´ )
/( _\ /____ []
| >(__|9|_____) ||
)( | | ___ ___ ||
-==- | | / _ \/ _ \||
|8|| (_) |(_) ||
/ \\___/\___(%%)
( ,-. ) |''|
\| |/ ||||
`--'
</pre>
So erzeugt das Script folgenden Perl-Code:<br />
<br />
<code class="tr_bq"><pre>#!/usr/bin/perl
use v5.10;
say ;
say " "x12,"/| |\\";
say " "x8,", ( `-´ )";
say " "x7,"/( _\\ /","_"x4," "x6,"[]";
say " "x6,"| >(__|9|","_"x5,")"," "x5,"||";
say " "x7,")("," "x4,"| | ___ ___ ||";
say " "x6,"-==- | | / _ \\/ _ \\||";
say " "x13,"|8|| (_) |(_) ||";
say " "x12,"/ \\\\___/\\___(%%)";
say " "x11,"( ,-. )"," "x8,"|''|";
say " "x12,"\\| |/"," "x9,"|"x4;
say " "x26,"`--'";
say ;
say ;
say ;1;
</pre></code>
<br />
<br />
Alternativ kann der Fuzzy-Mode eingeschaltet werden, der ff. Code erzeugt:<br />
<br />
<code class="tr_bq">
#!/usr/bin/perl<br />
use v5.10;<br />
used in fuzzy mode<br />
say "\n"," "x12,"/| |\\\n"," "x8,","," "x2,"( `-´ )\n"," "x7,"/("," "x2,"_\\"," "x3,"/","_"x4," "x6,"[]\n"," "x6,"|"," "x2,">(","_"x2,"|9|","_"x5,")"," "x5,"|"x2,"\n"," "x7,")("," "x4,"| |"," "x2,"_"x3," "x2,"_"x3," ","|"x2,"\n"," "x6,"-","="x2,"-"," "x3,"| | / _ \\/ _ \\","|"x2,"\n"," "x13,"|8","|"x2," (_) |(_) ","|"x2,"\n"," "x12,"/"," "x3,"\\"x2,"_"x3,"/\\","_"x3,"(","%"x2,")\n"," "x11,"( ,-. )"," "x8,"|","'"x2,"|\n"," "x12,"\\| |/"," "x9,"|"x4,"\n"," "x26,"`","-"x2,"'\n","\n","\n",;1; </code>
<br />
<br />
Hier das Script:<br />
<code class="tr_bq"><pre>
#!/usr/bin/env perl
#===============================================================================
#
# FILE: compress_asciiart.pl
#
# USAGE: ./compress_asciiart.pl
#
# DESCRIPTION: compresses asciiart (or any text) to small perlcode using RLE
#
# OPTIONS: -f (enables fuzzing)
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: Andreas Romeyke
# ORGANIZATION:
# VERSION: 1.0
# CREATED: 08.04.2019
# REVISION: ---
#===============================================================================
use strict;
use warnings;
use utf8;
print "#!/usr/bin/perl\n";
print "use v5.10;\n";
my $fuzzy=0;
my $runlength=3;
if (defined $ARGV[0] && $ARGV[0] eq "-f") {
print STDERR "used in fuzzy mode\n";
$runlength=1;
$fuzzy=1;
}
sub subs {
my $s1 = shift;
my $s2 = shift;
my $l = length($s2)+1;
$s1=~s/\\/\\\\/g;
$s1=~s/"/\\"/g;
$s2=~s/\\/\\\\/g;
$s2=~s/"/\\"/g;
my $v;
if ($l > $runlength) {
return
qq(").
qq($s1).
"\"x$l,";
} else {
return
qq(").
qq($s1$s2).
qq(",)
;
}
}
print "say ";
foreach my $line (<stdin>) {
chomp $line;
$line=~s/(.)(\1*)/my $l=length($2);subs($1, $2);/eg;
if ($fuzzy) {
$line =~ s/$/\"\\n\",/;
} else {
$line =~ s/$/;\nsay /;
}
while ($line=~s/"([^"]+)","([^"]+)",/"$1$2",/g) {};
$line=~s/,;\n/;\n/g;
print $line;
}
print ";1;";
1;
</stdin></code></pre><br />
<br />
Wer noch weitere Vorschläge hat, wie man noch eleganteren Code erzeugen kann, immer her damit :)<br />
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-55905587537722115152018-05-28T13:29:00.002+02:002018-05-28T13:29:59.296+02:00Vim, Ersetzen von "foo" durch Dateinamen der zu bearbeitenden DateiManchmal, zB. bei der Erstellung von C++-Klassen möchte man bestimmte Textstellen durch Texte ersetzen, die aus dem Dateinamen der Datei gewonnen werden.<br />
<br />
Will man zB. in der Datei "<span style="font-family: "Courier New",Courier,monospace;">datei.txt</span>" alle Vorkommen von "<span style="font-family: "Courier New",Courier,monospace;">foo</span>" durch "<span style="font-family: "Courier New",Courier,monospace;">datei</span>" ersetzen, gelingt dies in Vim im Kommandomodus so:<br />
<br />
<blockquote class="tr_bq">
%s/foo/\=expand('%:r:t')/</blockquote>
<br />
Mit "<span style="font-family: "Courier New",Courier,monospace;">\=</span>" weist man Vim an, nicht direkt den Ersetzungstext zu verwenden, sondern ein Vim-Kommando auszuführen.<br />
<br />
"<span style="font-family: "Courier New",Courier,monospace;">expand</span>" liest hier den Dateinamen aus "<span style="font-family: "Courier New",Courier,monospace;">%</span>" aus, wendet Prefix- und Suffix-Magie ("<span style="font-family: "Courier New",Courier,monospace;">:r:t</span>") an und gibt den Ersetzungsstring zurück.<br />
<br />
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-81462893605170210852017-03-07T11:40:00.001+01:002017-03-07T11:40:11.642+01:00Geschafft!So, ich habe es geschafft. Meine Masterarbeit wurde nun endlich korrigiert und ich darf sie nun veröffentlichen:<br />
<br />
<a href="http://andreas-romeyke.de/bkm/">http://andreas-romeyke.de/bkm/</a><br />
<br />
<br />
Das Studium neben dem Beruf wäre nicht möglich gewesen ohne die großartige Unterstützung meiner Familie, aber auch meiner Kollegen von der SLUB. Inbesondere möchte ich meinem Kollegen Jörg danken, mit dem ich viele Gedanken austauschen konnte.<br />
<br />
Wer mehr über digitale Langzeitarchivierung von ihm und mir lesen möchte, der schaue mal bei <a href="http://kulturreste.blogspot.de/">Kulturreste</a> vorbei. :)<br />
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-35304611209318015072017-02-16T17:29:00.001+01:002017-02-16T17:29:26.357+01:00Rezept, Testdaten 4k 16bit RGB für FFV1 v3 erzeugenFür Tests im Rahmen der digitalen Langzeitarchivierung von Videodaten benötige ich große Videofiles, um daran Validitätswerkzeuge und auch den Ingest zu überprüfen.<br />
<br />
Für die Langzeitarchivierung empfiehlt sich Matroska als Containerformat und FFV1 als verlustfreier Codec. Dieser wird aktuell durch die <a href="https://datatracker.ietf.org/wg/cellar/charter/">Cellar-Group</a> bei der IETF standardisiert.<br />
<a href="http://d-nb.info/1078886237/34">FFV1 v3</a> kommt in der <a href="https://ffmpeg.org/">ffmpeg</a> Version 3.2.4 mit 16-Bit Unterstützung.<br />
<br />
<br />
Mehr zu FFV1 v3 auch im Nachgang der "<a href="https://github.com/preforma/notimetowait">No Time to Wait</a>"-Konferenz. <br />
<br />
Im Folgenden mein Script zur Generierung einer 1200s langen Videodatei. Diese enthält künstlich erzeugtes Rauschen um halbwegs die Realität widerzuspiegeln.<br />
<br />
Hier das Script:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">#!/bin/bash<br /># erzeugt Video im MKV/FFV1v3 Format<br /><br />DURATION=1200<br />FRAMERATE=24<br />THREADS=8<br />PXFORMAT="rgb48le"<br />FRAMESIZE="3840x2160"<br /><br />/tests/ffmpeg-3.2.4/ffmpeg \<br /> -loglevel verbose \<br /> -f lavfi \<br /> -i "mandelbrot=s=$FRAMESIZE:r=$FRAMERATE" \<br /> -pix_fmt $PXFORMAT \<br /> -t $DURATION \<br /> -vf noise=alls=5:allf=t \<br /> -vcodec ffv1 \<br /> -level 3 -threads $THREADS -coder 1 -context 1 -g 1 -slices 24 -slicecrc 1 \<br /> -strict experimental \<br /> test_$PXFORMAT.mkv<br /><br />zzuf -b40- -c -r0.001 <test_$PXFORMAT.mkv >fuzzy_$PXFORMAT.mkv<br /><br />echo "created mandelbrot video $DURATION s a $FRAMERATE fps with framesize \<br />$FRAMESIZE in pixelformat $PXFORMAT as file test_$PXFORMAT.mkv, also created \<br />a fuzzified variant with r=0.001 broken bits as file fuzzy_$PXFORMAT.mkv" | tee report.txt</span><br />
<br />
Zudem wird noch eine gefuzzte Datei erzeugt, die künstliche Bitfehler enthält.<br />
<br />
Die Datei wird in 4K-Auflösung erzeugt, das PXFORMAT=rgb48le definiert 16Bit pro RGB-Farbkanal, der Filter "<span style="font-family: "Courier New",Courier,monospace;">-vf noise=alls=5:allf=t</span>" erzeugt Gaussches Rauschen, welches pro Frame variert. Für FFV1 gibt Level 3 an, dass die Version 3 (für Langzeitarchivierung geeignet) verwendet werden soll. Es wird nur eine GOP=1 verwendet (-g 1), jedes Frame wird in 24 Slices geteilt, die jeweils durch CRC Prüfsummen gesichert sind. Die Angabe "-strict experimental" schaltet die 16-Bit-Option für FFV1 frei.<br />
<br />
Der Fuzzer zzuf überspringt die ersten 40 Bytes der Datei und erzeugt dann mit einer Rate von 0.001 fehlerhafte Bits.<br />
Diese Datei wird später mit Validierungs- und Reparaturwerkzeugen verwendet, um die Robustheit des FFV1/MKV Gespanns zu testen.<br />
<br />
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-9845221891041450152016-12-31T19:42:00.001+01:002018-04-02T15:00:08.194+02:00Schicht's Kochbuch Bd. 1<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-6thFD97qPXs/VH2tjDOx4cI/AAAAAAAABmk/xhmlIEKvdWQnCRzUI6frEDDcflF3sNwMgCPcB/s1600/Schichts_Kochbuch_Bd1_Umschlag1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://3.bp.blogspot.com/-6thFD97qPXs/VH2tjDOx4cI/AAAAAAAABmk/xhmlIEKvdWQnCRzUI6frEDDcflF3sNwMgCPcB/s320/Schichts_Kochbuch_Bd1_Umschlag1.jpg" width="225" /></a></div>
Dieser Tage hatte ich einen alten Artikel von mir gelesen, in dem ich aus "Schicht's Kochbuch" die <a href="http://art1pirat.blogspot.de/2014/12/sachertorte.html">Sachertorte</a> vorgestellt habe.<br />
<br />
Das alte Heftchen ist mittlerweile in einem erbärmlichen Zustand. Es besteht aus Holzschliff und das Papier zerfällt langsam (mehr darüber in <a href="http://www.spektrum.de/magazin/gefaehrdung-restaurierung-und-konservierung-von-schriftgut/822535">http://www.spektrum.de/magazin/gefaehrdung-restaurierung-und-konservierung-von-schriftgut/822535</a>).<br />
<br />
Da ich über die Feiertage etwas Zeit hatte, habe ich mich hingesetzt und "Schicht's Kochbuch Bd. I" digitalisiert. Die Scandaten belegten ca. 1,2 GB.<br />
<br />
Für das Postprocessing habe ich wie schon beim <a href="http://art1pirat.blogspot.de/2015/10/dschiu-dschitsu.html">Dschiu-dschitsu Projekt</a> das Programm <a href="http://scantailor.org/">Scantailor</a> verwendet.<br />
<br />
Die entstandenen TIFF-Seiten hatte ich diesmal doch via <a href="https://github.com/jwilk/didjvu">didjvu</a> zu einem djvu-File konvertiert:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$> didjvu bundle -o Schichts_Kochbuch_Bd1.djvu *.tif</span><br />
<br />
Mit <a href="https://github.com/jwilk/ocrodjvu">ocrodjvu</a> habe ich dann noch den OCR-Layer hinzugefügt:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$> ocrodjvu -l deu -e tesseract --in-place Schichts_Kochbuch_Bd1.djvu</span><br />
<br />
Die Kompressionsrate ist beachtlich, aus knapp 98MB TIFF-Dateien entsteht eine nur 3.358.164 Byte große djvu-Datei (eine PDF-Datei wird ca. 19MB groß). Die Texte sind nahezu fehlerfrei von <a href="https://github.com/tesseract-ocr">tesseract</a> erkannt wurden.<br />
<br />
Alles in allem brauchte ich für die ca. 77 Seiten knapp 10h für Digitalisierung und Nachbearbeitung. <br />
<br />
Das Buch ist unter <a href="http://andreas-romeyke.de/Schichts_Kochbuch_Bd1.djvu">http://andreas-romeyke.de/Schichts_Kochbuch_Bd1.djvu</a> zu finden.<br />
<br />
<h2>
Update 2018-04-02</h2>
<br />
Durch einen Hinweis von Stefan (unbekannterweise) konnte ich zwei Fehler korrigieren, so stimmte die Reihenfolge der Seiten 24b-26 (die betreffende Lage war lose und falsch eingeordnet) nicht und die Seite 47 war unvollständig gescannt. Leider bin ich erst jetzt dazu gekommen, die beiden Probleme zu korrigieren. Die neue Datei findet sich an og. Stelle (9MB).<br />
<br />
Danke nochmal an Stefan für den Hinweis!Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-69275565386125792392015-10-29T15:20:00.002+01:002015-10-29T15:20:48.407+01:00Hilfe, ich verstehe nicht in welcher Auflösung ich scannen muß!<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-MZ-OSc-Q3gc/VjIqN8rou7I/AAAAAAAABlM/bdohJofxCXY/s1600/vergroesserung_scanseite_fraktur.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="http://3.bp.blogspot.com/-MZ-OSc-Q3gc/VjIqN8rou7I/AAAAAAAABlM/bdohJofxCXY/s1600/vergroesserung_scanseite_fraktur.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">mindestens 2 Pixel Abstand zwischen Glyphen,<br />
aber auch mindestens 2 Pixel für dünne<br />
Bestandteile eines Glyphen</td><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
<h1 id="FAQ-WasbedeutetDPIbzw.Auflösung?-Allgemein">
Allgemein</h1>
mit
der Angabe <a href="https://de.wikipedia.org/wiki/Punktdichte">dpi (dots per inch)</a> definiert man die <a href="https://de.wikipedia.org/wiki/Bildaufl%C3%B6sung">Auflösung eines digitalen Bildes</a>. Man gibt an welcher Länge eine gewissen Anzahl von
Pixeln eines Bildes entsprechen. In den Digitalisierungsrichtlinien<a href="http://www.dfg.de/formulare/12_151/12_151_de.pdf"> zB. der DFG</a> wird oft eine Auflösung von 300 dpi angegeben. Dies bezieht sich
immer auf 1:1 Vorlagen, sprich, wenn Original und (digitale)
Reproduktion die gleiche Größe besitzen. 300pi sind dann ein guter
Kompromiß zwischen Dateigröße und Schärfegrad, bzw
Nicht-mehr-Pixeligkeit beim 1:1 Druck.<br />
<br />
Die Auflösung ist
daher auch ein Maß der <a href="https://en.wikipedia.org/wiki/Spatial_frequency">Ortsfrequenz</a> des digitalen Bildes. Die Wahl der
Scanauflösung bestimmt daher auch die Anfälligkeit des Digitalisats für
<a href="https://de.wikipedia.org/wiki/Alias-Effekt">Aliasing-Effekte</a> in Abhängigkeit der Details des Originals.<br />
<br />
Für
die Berechnung gilt, wenn die Druckgröße von der Scangröße abweicht,
wie dies zB. bei der Microverfilmung passiert oder bei
Reproduktionsvergrößerungen, muß man etwas mehr genauer hinschauen.<br />
<br />
<br />
Anzahl der Pixel<br />
Auflösung = ----------------<br />
Breite der Vorlage<br />
<br />
<h1 id="FAQ-WasbedeutetDPIbzw.Auflösung?-Beispiel1:1Kopie">
Beispiel 1:1 Kopie</h1>
Liegt
das Original in 10 x 10 inch vor und man möchte eine 1:1 Kopie im Druck
darstellen, dann reichen die zB. bei der DFG angegebenen 300dpi, da
dies dann 3000 x 3000 Pixeln entspricht.<br />
<h1 id="FAQ-WasbedeutetDPIbzw.Auflösung?-BeispielBildschirmansicht">
</h1>
<h1 id="FAQ-WasbedeutetDPIbzw.Auflösung?-BeispielBildschirmansicht">
Beispiel Bildschirmansicht</h1>
Viele
Bildschirme kommen mit einer Auflösung von 100 dpi (früher 75 oder 90
dpi). Wenn man also ein Dokument 10x10 inch mit 300dpi gescannt hat,
dann macht dies 3000x3000 pixel. Der Monitor kann aber nur 100dpi
anzeigen, daher wird der Scan am Monitor mit je 3000dots/100 dpi = 30
inch Größe angezeigt.<br />
<h1 id="FAQ-WasbedeutetDPIbzw.Auflösung?-BeispielMicrofilmundVergrößerung">
</h1>
<h1 id="FAQ-WasbedeutetDPIbzw.Auflösung?-BeispielMicrofilmundVergrößerung">
Beispiel Microfilm und Vergrößerung</h1>
wenn es sich um Microfilm handelt, wären 200dpi *<b>erst recht</b>* zuwenig. Die 300dpi wurden für eine 1:1 Repräsentation festgelegt.<br />
<br />
Wenn
Du vom Microfilm scannst, willst Du aber auf das Original vergrößern,
dh.die notwendige DPI-Zahl ergibt sich aus der Zielgröße.<br />
<br />
Ein
Original der Größe 10x10 inch wurde auf Microfilm der Größe 0,1x0,1
inch verfilmt. Die Verfilmung soll gescannt werden, damit man
Reproduktionen des Originals von 20x20 inch anfertigen kann.<br />
<br />
Bei
einer Druckauflösung von 300dpi müsste man also die 20x20 inch
Reproduktion anfertigen. Das macht aber die 200fache (2x größer als
Original und jenes 100x größer als Microverfilmung) Vergrößerung der
Microverfilmung aus, du brauchst daher 200*300dpi = 60.000dpi.<br />
<br />
Ist
auch logisch, denn wenn Du 0,1 inch mit zum Beispiel 200dpi scannen
würdest, bekämst Du 200dpi * 0,1 inch = 20 Pixel heraus. Diese 20 Pixel
würdest Du im Beispiel auf 20 inch verteilen, womit ein Pixel genau 1
inch groß wäre.<br />
<br />
Wenn Du aber die 0,1 inch mit 60.000dpi
scannst, bekommst Du 60.000dpi * 0,1 inch = 6000 pixel heraus, die Du
in der Vergrößerung auf 20 inch verteilst, was 6000dots/20inch = 300dpi
Druckauflösung entspricht.Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-15893005793023041482015-10-18T15:48:00.000+02:002015-10-18T16:00:12.669+02:00Dschiu-Dschitsu<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-4PdGUxsu1Go/ViOfPw2bZ9I/AAAAAAAABk8/cvnqlYNbEaw/s1600/u1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="400" src="http://2.bp.blogspot.com/-4PdGUxsu1Go/ViOfPw2bZ9I/AAAAAAAABk8/cvnqlYNbEaw/s400/u1.jpg" width="268" /></a></div>
<a href="http://3.bp.blogspot.com/-3T_QGmTMNQM/ViOe9cUJefI/AAAAAAAABk0/fvdyAJK1VrE/s1600/u1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a>
Das nebenstehende Büchlein hatte ich vor ein paar Wochen auf dem Flohmarkt erstanden.<br />
<br />
Unter der Adresse <a href="http://andreas-romeyke.de/Dschiudschitsu.djvu">http://andreas-romeyke.de/Dschiudschitsu.djvu</a> habe ich die digitalisierte Datei als <a href="https://de.wikipedia.org/wiki/DjVu">DJVu</a> frei zur Verfügung gestellt (einen Urheberrechtsvermerk konnte ich bei der DNB nicht finden, IMHO sollte es mittlerweile gemeinfrei sein)<br />
<br />
Das Büchlein wurde mittels xsane gescannt, dann mit <i>tiff2pdf</i>, <i>pdf2djvu</i> in ein DJVu konvertiert.<br />
<br />
Mit <i>didjvu</i> würde man bessere Ergebnisse erzielen, leider erzeugt das Programm zZ. aber invertierte Seiten, wenn man es mit monochromen TIFFs füttert.<br />
<br />
Die OCR erfolgte über <i>ocrodjvu</i> unter Zuhilfenahme von <i>tesseract</i> 3.03 und "<i>-l deu-frak</i>". Ein Postprocessing erfolgte nicht, einzig die Überschriften und Bildunterschriften wurden manuell mit <i>djvusmooth </i>nachkorrigiert.<br />
<br />
Die Metadaten wurden über <i>djvused</i> hinzugefügt.<br />
<br />
Anbei nochmal eine Zusammenfassung der Metadaten (nach <a href="http://d-nb.info/36273528X">Angabe der DNB</a>):<br />
<br />
<ul>
<li>Author: "Shunsho, Daiji"</li>
<li>Titel: "Dschiu-Dschitsu"</li>
<li>Erscheinungsjahr: 1926<br />Teil der: "Miniatur-Bibliothek ; 721/722"</li>
<li>Verlag: "Leipzig : Verlag für Kunst und Wissenschaft, 1926."</li>
</ul>
Wenn jemand den Volltext korrigiert, ich wäre an der korrigierten Fassung interessiert. Wer og. Digitalisat weiterverwenden will, dem bitte ich zur Aufrechterhaltung meiner Motivation um eine kleine Erwähnung. :)<br />
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-18270332223807736752015-10-12T11:53:00.001+02:002015-10-12T11:55:27.439+02:00Der Mythos Audio in Digitalisierungsempfehlungen<h2 class="tr_bq">
Das Problem</h2>
<br />
Ich arbeite im Bereich der digitalen Langzeitarchivierung und bei den Diskussionen, in welcher Form wir Filmmaterial (zB. 16mm Lichtton) haben wollen, bekomme ich immer wieder Digitalisierungsempfehlungen um die Ohren gehauen, die mir als Informatiker mit nachrichtentechnischem Hintergrund nicht einleuchten.<br />
<br />
Für Bildmaterial gibt Kodak an, daß man in 3600dpi scannen sollte, damit man die höchste Ortsfrequenz, die der Film auflöst noch erfasst hat. Das ist für mich einsichtig.<br />
<br />
Jetzt wird es kurios. Nach einigen Recherchen beträgt die Bandbreite für Ton auf 16mm Film in Lichttontechnik nur 5kHz. Nach <a href="https://de.wikipedia.org/wiki/Nyquist-Shannon-Abtasttheorem">Shannon-Niquist</a> reicht es also den Ton mit 10kHz zu digitalisieren, gehen wir auf nächsthöhere übliche Frequenz, dann wären wir bei 16kHz.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-GK8xNyA5PMo/VhuAh17X2VI/AAAAAAAABkk/--MVhkdgruc/s1600/abtastung.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="292" src="http://3.bp.blogspot.com/-GK8xNyA5PMo/VhuAh17X2VI/AAAAAAAABkk/--MVhkdgruc/s400/abtastung.png" width="400" /></a></div>
<br />
Als ich dies vorschlug regte sich massiver Widerstand, "Ja, aber die und die sagen 96kHz!"<br />
<br />
Und tatsächlich:<br />
* ALCTS empfiehlt mindestens 96kHz: <a href="http://www.ala.org/alcts/resources/preserv/minimum-digitization-capture-recommendations#audio">http://www.ala.org/alcts/resources/preserv/minimum-digitization-capture-recommendations#audio</a><br />
* IASA empfiehlt 48kHz, besser seien mindestens 96kHz <a href="http://www.iasa-web.org/tc04/audio-preservation">http://www.iasa-web.org/tc04/audio-preservation</a><br />
<br />
Hmm, vielleicht wäre eine Erklärung, daß Shannon sein Theorem auf ideale Filter stützt, die in der Praxis nicht vorkommen. Doch neuere Literatur zeigt, daß Shannon-Niquist auch heute noch Gültigkeit hat, auch unter Bedingungen von nicht-idealen Filtern: <br />
<blockquote>
<a href="http://bigwww.epfl.ch/publications/unser0001.html">Sampling—50 Years After Shannon <br /> M. Unser <br /> Proceedings of the IEEE, vol. 88, no. 4, pp. 569-587, April 2000. </a> <a href="http://bigwww.epfl.ch/publications/unser0001.html"> This paper presents an account of the current state of sampling, 50 years after Shannon's formulation of the sampling theorem. The emphasis is on regular sampling where the grid is uniform. This topic has benefited from a strong research revival during the past few years, thanks in part to the mathematical connections that were made with wavelet theory. To introduce the reader to the modern, Hilbert-space formulation, we re-interpret Shannon's sampling procedure as an orthogonal projection onto the subspace of bandlimited functions. We then extend the standard sampling paradigm for a representation of functions in the more general class of "shift-invariant" functions spaces, including splines and wavelets. Practically, this allows for simpler—and possibly more realistic—interpolation models, which can be used in conjunction with a much wider class of (anti-aliasing) pre-filters that are not necessarily ideal lowpass. We summarize and discuss the results available for the determination of the approximation error and of the sampling rate when the input of the system is essentially arbitrary; e.g., non-bandlimited. We also review variations of sampling that can be understood from the same unifying perspective. These include wavelets, multi-wavelets, Papoulis generalized sampling, finite elements, and frames. Irregular sampling and radial basis functions are briefly mentioned.</a> </blockquote>
<h2>
Woher die Diskrepanz?</h2>
Nach etwas mehr Recherche sieht es so aus, daß Digitalisierungsempfehlungen für Audio zwar oft 48, 96 oder gar 192kHz Samplingrate empfehlen, <b>nicht</b> aber hinschreiben, <b>warum das sinnvoll wäre</b>.<br />
<br />
Nach einigen Gesprächen scheint sich ein klareres Bild zu ergeben. Man sampelt die Audioquellen mit dem n-fachen der Grenzfrequenz, um statt im analogen Bereich lieber digital zu filtern. Für digitale Filterung ist es aber nötig höher abzutasten (damit man mehr "Datenpunkte" für den Filter bekommt)<br />
<br />
Was aber nun das eigentliche Problem ist, die hochgesampelten und ggf. digitalgefilterten Daten werden nicht wieder heruntergesampelt auf die untere (notwendige) Samplingrate. Gehen wir von Hifi Audio aus, dann hat man da vlt. Frequenzen von bis zu 24kHz im Audiosignal (die man haben will) und Rauschen und sonstige Störgeräusche oberhalb 24kHz, die man nicht haben will . Bei einer analogen Filterung müßte man nun einen steil wirkenden Tiefpaß mit der Grenzfrequenz von 24kHz einsetzen. Das Problem ist, daß zB. ein einfacher Butterworth-Filter das Signal ab der Grenzfrequenz nur um 3dB dämpft. Die gedämpften Anteile ab der Grenzfrequenz werden aber mit digitalisiert und verletzen dann das Niquist-Kriterium und sorgen für Aliasing-Effekte.<br />
<br />
Wenn man dagegen digital filtert, kann man die Grenzfrequenz durch das Überabtasten (oversampling) erstmal nach oben schieben und ein billiges analoges Filter nehmen. Der eigentliche interessante Bereich (die 24kHz) wird dann mit digitalen Filtern "herausgearbeitet". Auch kann man digitale Filter so konstruieren, daß diese nicht zu Schwingungen angeregt werden und Quantisierungsfehler nur geringen Einfluß haben.<br />
<br />
<br />
<br />
<h2>
Warum Digitalisierungempfehlungen nicht wirklich hilfreich sind </h2>
Ich will im Archiv das Signal aufbewahren, mit welchem ich das Original
rekonstruieren kann. Dabei muss ich ressourcenschonend arbeiten, da wir
zur Absicherung mehrere Kopien an unterschiedlichen Stellen vorrätig
halten müssen.<br />
<br />
Das Problem ist nun, daß man nun für ein 24kHz Signal 192.000 Samples pro Sekunde bekommt und in den Digitalisierungsempfehlungen nur das Upsamplen (ohne Begründung) drin steht, aber weder Angaben zur digitalen Filterung, noch zum eigentlich notwendigen Downsampling (genauer Decimation) gemacht werden.<br />
<br />
Der Witz ist, daß die Argumente, die für den Audiobereich für das Upsampling genannt werden, in gleichem Maße auch für den Videobereich gelten. Nur daß wir es hier mit drei Dimensionen zu tun hätten: Upsampling in horizontaler, in vertikaler und in zeitlicher Auflösung. Dies würde bedeuten, daß man bei der Digitalisierung von Kodak-Film nicht mit 3600dpi, sondern mit n*1800 dpi (wenn wir Audio 24kHz auf 192kHz als Vorbild nehmen würden, dann mit 8-fachem Oversampling, d.h. mit 14.400 dpi scannen müßten. Wir würden also bei den Einzelbildern eine 4*4=16fach höhere Datenmenge bekommen. Wenn man das noch bei zeitlicher Komponente macht (statt 24 fps mit 4*24=96fps) bekämen wir 64fach höhere Datenmenge. Wir könnten dann zwar nach Lust und Laune digital im örtlichen und zeitlichen Bereich filtern, würden dafür aber an den nächsten Baum geknüpft :)<br />
<br />
Wer weiterlesen mag, wie das alles im Detail funktioniert, dem empfehle ich als Einstieg den Wikipediaartikel <a href="https://en.wikipedia.org/wiki/Decimation_(signal_processing)">https://en.wikipedia.org/wiki/Decimation_(signal_processing)</a> und <a href="https://de.wikipedia.org/wiki/%C3%9Cberabtastung">https://de.wikipedia.org/wiki/Überabtastung</a>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-53671982404355194502014-12-17T15:33:00.000+01:002014-12-17T15:33:06.405+01:00Perl RegEx mit variable length look-behind um Römische Zahlen in Text bedingt zu ersetzen<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="http://commons.wikimedia.org/wiki/File%3AHerrenbergStiftskirche060427.jpg" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;" title="von JuergenG (made by JuergenG) [GFDL (http://www.gnu.org/copyleft/fdl.html), CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0/) oder CC BY-SA 2.5-2.0-1.0 (http://creativecommons.org/licenses/by-sa/2.5-2.0-1.0)], via Wikimedia Commons"><img alt="HerrenbergStiftskirche060427" height="244" src="//upload.wikimedia.org/wikipedia/commons/thumb/a/a4/HerrenbergStiftskirche060427.jpg/512px-HerrenbergStiftskirche060427.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Quelle: Wikimedia, Lizenznachweis sh. Link Bild</td></tr>
</tbody></table>
<h2>
Das Problem</h2>
<br />
In einem Text sollen <a href="http://de.wikipedia.org/wiki/R%C3%B6mische_Zahlschrift">Römische Zahlen</a> durch die selbstdefinierte <a href="http://www.methods.co.nz/asciidoc/">Asciidoc</a>-Notation <span style="font-family: "Courier New",Courier,monospace;">roman::number[]</span> ausgezeichnet werden. Asciidoc erlaubt zur Zeit allerdings nicht weitere Markups innerhalb einer Bildauszeichnung.<br />
<br />
Sprich:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">.Konrad roman::number[I]. von Wettin. Luitgard, Konrads roman::number[I]. Gemahlin.<br />[caption=""]<br />image:img/011_Konrad_Luitgard.svg[Konrad I. von Wettin. Luitgard, Konrads I. Gemahlin.]</span></blockquote>
<br />
funktioniert, aber<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">.Konrad roman::number[I]. von Wettin. Luitgard, Konrads roman::number[I]. Gemahlin.<br />[caption=""]<br />image:img/011_Konrad_Luitgard.svg[Konrad roman::number[I]. von Wettin. Luitgard, Konrads roman::number[I]. Gemahlin.]</span></blockquote>
<br />
nicht, da in Asciidoc Tags der Form <span style="font-family: "Courier New",Courier,monospace;">image:foo.png[baz]</span> innerhalb von <i>baz</i> keine anderen asciidoc-Tags enthalten darf.<br />
<br />
<h2>
Römische Zahlen finden</h2>
<br />
Wenn wir nach römischen Zahlen suchen, könnten wir <a href="http://andreas-romeyke.de/privat/regex.pdf">Reguläre Ausdrücke</a> (RegEx) benutzen. In <a href="http://perldoc.perl.org/perlre.html">Perl sähe eine RegEx</a> dann beispielsweise so aus:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">my $roman_number = qr{</span><br />
<span style="font-family: "Courier New",Courier,monospace;">( </span><br />
<span style="font-family: "Courier New",Courier,monospace;"> (I{1,3})| # I … III</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> (I?V)| # IV … V</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> (VI{1,3})| # VI … VIII</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> (I?X) # IX … X</span><br />
<span style="font-family: "Courier New",Courier,monospace;">)</span><br />
<span style="font-family: "Courier New",Courier,monospace;">}x;</span></blockquote>
<span style="font-family: "Courier New",Courier,monospace;"><br /></span>
<br />
<h2>
Teststring</h2>
<br />
Bevor wir weitermachen, sollten wir uns einen Teststring definieren, der alle möglichen Varianten enthält und es uns erlaubt die RegExes zu überprüfen:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">my $string=<<TEST;<br />.Konrad I. von <br />.Konrad I. von Wettin. Luitgard, Konrads I. Gemahlin.<br />break::folding[test] .Konrad I. von Wettin. break::folding[test2] Luitgard, Konrads I. Gemahlin.<br />[caption=""]<br />image:img/011_Konrad_Luitgard.svg[Konrad I. von Wettin. Luitgard, Konrads I. Gemahlin.]<br />Im Frühjahr<br />fertig. Im Frühjahr<br />mahlin. Im Frühling 1147 nahm er mit vielen der ſächſiſchen Fürſten das<br />als der Imker<br />I. Foo<br />Foo I.<br />Foo II.<br />Foo III.<br />Foo IV.<br />Foo V.<br />Foo VII.<br />Foo VIII.<br />Foo IX.<br />Foo X.<br />Foo XIII.<br />Foo XIV.<br />Foo XX.<br />Foo XV.<br />BarI.<br />BarII.<br />IBaz<br />Vettel<br />Xanthippe<br />Baz IIII.<br />Baz IIV.<br />Baz IIIV.<br />Baz IIX.<br />Baz XIIII<br />Baz VV.<br />Baz VX.<br />Baz IXIX.<br />Baz IVX.<br />Baz IIX.<br />Baz VIIX.<br />Baz XIVI.<br />TEST</span></blockquote>
<br />
<h2>
Lookbehind und Lookahead</h2>
<br />
Unsere oben definierte RegEx allein reicht für obiges Beispiel nicht, da wir zB. nicht innerhalb einer <i>[]</i>-Klammer römische Zahlen ersetzen wollen. Eine Abhilfe wäre, wenn wir im String beliebig zurückschauen könnten, ob eine Klammer noch offen ist.<br />
<br />
In Perl sind zwar beliebig tiefe lookahead-Bedingungen in Regulären Ausdrücken erlaubt, allerdings nicht in lookbehind-Bedingungen.<br />
<br />
Sprich, mit <span style="font-family: "Courier New",Courier,monospace;">(?<=foo)bar</span> würden wir auf <i>bar</i> matchen, wenn vorher der fixe String <i>foo</i> auftaucht. Aber <span style="font-family: "Courier New",Courier,monospace;">(?<=fo+)bar</span> funktioniert unter Perl5 nicht.<br />
<br />
Lookahead hat diese Einschränkungen nicht, wenn ich also auf <i>foo</i> matchen will, aber nur, wenn <i>bar</i> oder <i>baar</i> oder <i>ba…ar</i> folgen, dann kann ich <span style="font-family: "Courier New",Courier,monospace;">foo(?=ba+r)</span> schreiben.<br />
<br />
<h2>
variable length lookbehind über variable length look ahead</h2>
<br />
Über <a href="http://oylenshpeegul.typepad.com/blog/2011/12/variable-length-look-behind-in-regular-expressions.html?cid=6a0133f3b2732e970b0162fd4f3efb970d#comment-6a0133f3b2732e970b0162fd4f3efb970d">einen Post in einem Forum bin ich auf eine Lösung gestolpert</a>: Drehe den String und die RegEx um. Statt:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">"foobar" =~ s/(?<=fo+)bar/baz/; #funktioniert nicht in Perl5</span></blockquote>
<br />
also alles umdrehen zu:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">"raboof" =~s/rab(?=o+f)/zab/; # zaboof -> reverse zaboof</span><span style="font-family: "Courier New",Courier,monospace;"> = foobaz</span></blockquote>
<br />
<h2>
Die Lösung</h2>
<br />
Zurück zum Problem mit Asciidoc und römischen Zahlen, die Lösung sieht in Gänze nun wie folgt aus:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">my $rstring = reverse $string;<br />my $roman_revregex=qr{<br /> (?<![IVXa-zſßäöü])( #lookbehind<br /> (I{1,3})| # I ... III<br /> (I{1,3}V)| # VI ... VIII<br /> (VI{0,1})| # IV ... V<br /> (XI{0,1})| # IX .. X <br /> (I{1,3}X)| # XI .. XIII<br /> (VI{0,1}X)| # XIV ... XV<br /> (I{1,3}VX)| # XVI ... XVIII<br /> (XX) # XX<br /> )(?=\ )(?![^\[\]]*\[) # lookahead<br /> }x;<br />$rstring=~s#$roman_revregex#\]$1\[rebmun::namor#g;<br />$string = reverse $rstring;<br />print $string, "\n\n";</span></blockquote>
<br />
Dies ergibt dann folgenden String:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">.Konrad roman::number[I]. von </span><br />
<span style="font-family: "Courier New",Courier,monospace;">.Konrad roman::number[I]. von Wettin. Luitgard, Konrads roman::number[I]. Gemahlin.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">break::folding[test] .Konrad roman::number[I]. von Wettin. break::folding[test2] Luitgard, Konrads roman::number[I]. Gemahlin.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">[caption=""]</span><br />
<span style="font-family: "Courier New",Courier,monospace;">image:img/011_Konrad_Luitgard.svg[Konrad I. von Wettin. Luitgard, Konrads I. Gemahlin.]</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Im Frühjahr</span><br />
<span style="font-family: "Courier New",Courier,monospace;">fertig. Im Frühjahr</span><br />
<span style="font-family: "Courier New",Courier,monospace;">mahlin. Im Frühling 1147 nahm er mit vielen der ſächſiſchen Fürſten das</span><br />
<span style="font-family: "Courier New",Courier,monospace;">als der Imker</span><br />
<span style="font-family: "Courier New",Courier,monospace;">I. Foo</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[I].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[II].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[III].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[IV].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[V].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[VII].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[VIII].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[IX].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[X].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[XIII].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[XIV].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[XX].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Foo roman::number[XV].</span><br />
<span style="font-family: "Courier New",Courier,monospace;">BarI.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">BarII.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">IBaz</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Vettel</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Xanthippe</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Baz IIII.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Baz IIV.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Baz IIIV.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Baz IIX.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Baz XIIII</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Baz VV.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Baz VX.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Baz IXIX.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Baz IVX.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Baz IIX.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Baz VIIX.</span><br />
<span style="font-family: "Courier New",Courier,monospace;">Baz XIVI.</span></blockquote>
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-30570872854053876732014-12-09T17:09:00.000+01:002014-12-09T17:09:10.924+01:00Seitenfehler im Ebookreader PRS300 von Sony<a href="http://4.bp.blogspot.com/-Q6pVjh7rbmM/VIccwqcsPaI/AAAAAAAABDI/RLRl4gjaBJU/s1600/IMG_20141209_165531.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-Q6pVjh7rbmM/VIccwqcsPaI/AAAAAAAABDI/RLRl4gjaBJU/s1600/IMG_20141209_165531.jpg" height="240" width="320" /></a>Lange hatte ich mich gewundert. In meinem Projekt ›<a href="http://art1pirat.blogspot.de/2014/01/und-die-bilder.html">Bunte Bilder aus dem Sachſenlande</a>« hatte ich <a href="http://art1pirat.blogspot.de/2014/11/svg-10-nach-svg-11.html">etliche Mühen</a> auf mich genommen, um möglichst exzellente Grafiken aus der Originalvorlage zu erzeugen und diese als <a href="http://en.wikipedia.org/wiki/Scalable_Vector_Graphics">SVG</a> bereitzustellen, damit die Ebookreader diese Vektorgrafiken auf ihre bevorzugte Auflösung rendern können.<br />
<br />
Das Programm <a href="https://github.com/idpf/epubcheck">epubcheck</a> meldete keinerlei Fehler mehr und auf den diversen Ebookreadern auf meinem PC wurde das <a href="http://idpf.org/epub/201">Epub2</a> soweit korrekt angezeigt.<br />
<br />
Nur einzig und allein auf meinem <a href="http://www.sony.de/support/de/product/PRS-300">Sony PRS300</a> hatte ich ein komisches Verhalten. Das Inhaltsverzeichnis wurde geladen und angezeigt. Doch sobald ich auf eine Seite ging, kam das Symbol "Seitenfehler". Wenn ich zwischendurch auf ein anderes Buch ging und später auf die Seite zurück, war manchmal der Seitenfehler verschwunden und die Seite korrekt gerendert. Nur beim Zurückkehren auf das Inhaltsverzeichnis, beim Vor- oder Zurückblättern tauchte der Fehler wieder auf.<br />
<br />
In einem letzten Test erzeugte ich ein Ebook, welches statt SVGs Bilder im <a href="http://de.wikipedia.org/wiki/Portable_Network_Graphics">PNG</a>-Format abspeicherte. Und siehe da, das Ebook ließ sich nutzen.<br />
<br />
Auf alle Fälle wäre ich jedem dankbar, der das Verhalten mit seinem Ebookreader mal versucht nachzustellen oder mir vielleicht eine Übersicht über die Einschränkungen der verschiedenen erhältlichen Ebookreader nennen kann. Über entsprechende Hinweise wäre ich sehr dankbar.<br />
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-59074510089775609432014-12-02T13:32:00.000+01:002014-12-02T13:51:52.872+01:00SachertorteEs ist Weihnachtszeit und da der letzte Beitrag etwas her ist, gibt es heute ein Rezept aus „Schicht's Kochbuch – ausgewählte Rezepte“<br />
Das Buch ist eigentlich eines von drei Heftchen, hier aus dem 1. Band, Mehlspeisen, im Druck von A. Haase, Prag. Die <a href="http://www.dnb.de/">DNB</a> verzeichnet als Erscheinungsjahr 1928-1931 (<a href="http://d-nb.info/56088897X">http://d-nb.info/56088897X</a>).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-6thFD97qPXs/VH2tjDOx4cI/AAAAAAAABCo/gtwE_0FBnrA/s1600/Schichts_Kochbuch_Bd1_Umschlag1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-6thFD97qPXs/VH2tjDOx4cI/AAAAAAAABCo/gtwE_0FBnrA/s1600/Schichts_Kochbuch_Bd1_Umschlag1.jpg" height="200" width="140" /></a></div>
<br />
Charakteristisch ist die minimalistische Darstellung der Rezepte.Hier das Rezept für Sachertorte aus Seite 38b:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-hduq1W0zJ78/VH2te9Bl27I/AAAAAAAABCg/mI_NJan6PDA/s1600/Schichts_Kochbuch_Bd1_38b.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-hduq1W0zJ78/VH2te9Bl27I/AAAAAAAABCg/mI_NJan6PDA/s1600/Schichts_Kochbuch_Bd1_38b.jpg" height="640" width="451" /></a></div>
<br />
Das Rezept in maschinenlesbarer Form:<br />
<br />
<blockquote class="tr_bq">
<b>Sacher-Torte.</b><br />
<br />
Zutaten: 16 dkg Visan, 15 dkg Zucker, 8 dkg Kakao, 6 Eier, 15 dkg<br />
Mehl, Sacherbuttercreme (siehe Creme), Schokoladenfondant (siehe Fondant).<br />
<br />
Zub ereitung; DasVisan wird mit dem Zucker schaumig gemischt,<br />
die Eidotter nach und nach dazugegeben, dann den Kakao daruntergemischt.<br />
<br />
*Dazu kommt der Schnee von den Eiklar und zuletzt das Mehl. Bei mäßiger '<br />
<br />
Hitze backen; nach dem Auskühlen in zwei Blätter schneiden und, mit Sacher-<br />
buttercreme füllen, mit Schokoladenfondant überziehen und auf jedes Torten-<br />
stück eine Praline aufsetzen. w ’<br />
<br />
W o r a uf k o m mt e s a n? Die Torte vor dem Füllen einen Tag stehen<br />
lassen. '<br />
<br />
Was kann mißlingen? Die Masse läuft aus der Form, wenn sie<br />
nicht genau in Papier eingeschlagen wird.</blockquote>
Die Sacher-Buttercreme wird auf S. 31 beschrieben:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-qg_zx6NGj8k/VH20uP5vlPI/AAAAAAAABC4/yrjwCJ-gGro/s1600/Schichts_Kochbuch_Bd1_31.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-qg_zx6NGj8k/VH20uP5vlPI/AAAAAAAABC4/yrjwCJ-gGro/s1600/Schichts_Kochbuch_Bd1_31.jpg" height="640" width="497" /></a></div>
<br />
Das Rezept in maschinenlesbarer Form:<br />
<br />
<blockquote class="tr_bq">
<b>Sacherbuttercreme.</b><br />
<br />
Z u t a t e n: 12 1/2 dkg Visan, 12 1/2 dkg Zucker, 2 Eigelb, 10 dkg Tunkmasse.<br />
Z u b e r e i t u n g: Das Eigelb wird schaumig geschlagen, der Zucker wird<br />
zum schwachen Flug gekocht und in einem schwachen Strahl in die flaumige Eigelbmasse hineingezogen; das Ganze dann kalt geschlagen. Nachher rührt<br />
man es in das Visan, welches unterdessen schaumig gerührt wurde. Nun mischt man noch die aufgelöste Tunkmasse darunter. </blockquote>
<blockquote class="tr_bq">
W o r a u f k o m m t e s a n? Das Eigelb gut aufschlagen.<br />
Was kann m iß l in gen? Die Tunkmasse wird bröslig, wenn sie zu<br />
warm aufgeweicht wird.</blockquote>
Das Ergebnis entstammt (ohne weitere Korrektur) der OCR mit dem folgenden Aufruf von Tesseract 3.03: <br />
<blockquote class="tr_bq">
$> tesseract Schichts_Kochbuch_Bd1_38b.png Schichts_Kochbuch_Bd1_38b -l deu</blockquote>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-82793761279312631802014-11-01T19:18:00.000+01:002014-11-01T19:24:08.579+01:00SVG 1.0 nach SVG 1.1Da <a href="http://en.wikipedia.org/wiki/EPUB">EPUB</a> 2.0 auf <a href="http://en.wikipedia.org/wiki/Scalable_Vector_Graphics">SVG</a> 1.1 <a href="http://www.idpf.org/epub/20/spec/OPS_2.0.1_draft.htm#Section2.3.4">referenziert</a>, sollten wir auch SVGs in der erwarteten Version erzeugen. Auf das Problem bin ich gestoßen, als ich für das »<a href="http://art1pirat.blogspot.de/2014/01/und-die-bilder.html">Bunte Bilder aus dem Sachſenlande</a>« - Projekt mal den <a href="https://github.com/idpf/epubcheck">epubcheck</a> aufgerufen hatten und ff. Meldungen bekam:<br />
<br />
<blockquote class="tr_bq">
$> epubcheck bunte_bilder.epub <br />
Validating against EPUB version 2.0 - custom validation<br />
Validating using EPUB version 2.0 rules.<br />
ERROR(RSC-005): bunte_bilder.epub/OEBPS/img/003_Wappen.svg(6,38): Error while parsing file 'value of attribute "version" is invalid; must be equal to "1.1"'.</blockquote>
<br />
Abhilfe schafft ff. Aufruf von <a href="https://inkscape.org/de/">inkscape</a>:<br />
<br />
<blockquote class="tr_bq">
$> inkscape -z -E=tmp.eps svg1.0.svg<br />
$> inkscape -z -l=svg1.1.svg tmp.eps</blockquote>
<br />
Die Zweiteilung mit Umweg über <a href="http://en.wikipedia.org/wiki/Encapsulated_PostScript">EPS</a> ist notwendig, weil inkscape SVGs dann nicht in neue Version konvertiert, wenn diese valide ist und alle Elemente in neuer Version gültig sind. Mit "<i>-z</i>" unterdrückt man die GUI und "<i>-E</i>" exportiert nach EPS, "<i>-l</i>" nach SVG.<br />
<br />
Um alle Bilder im Verzeichnis zu konvertieren, nutzt man ff. Schleife in der Bash:<br />
<br />
<blockquote class="tr_bq">
$> for i in *.svg; do inkscape -z -E=tmp.eps $i; inkscape -z -l=$i tmp.eps; rm -f tmp.eps; done </blockquote>
<br />
Wer noch andere Varianten/Tools kennt, melde sich bitte. :)Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-46599874213962192772014-06-13T17:16:00.000+02:002014-06-13T17:16:47.957+02:00tiff Reparatur - HelferleinIn einem früheren Beitrag »<a href="http://art1pirat.blogspot.de/2013/07/baseline-tiff.html">baseline TIFF</a>« hatte ich den Aufbau von TIFFs beschrieben. <br />
<br />
Eines der häufigsten Probleme, die bei der Validierung von TIFFs auftauchen, sind falsche Datum-Zeichenketten im <i>datetime</i>-Tag.<br />
<br />
Unter <a href="https://github.com/SLUB-digitalpreservation/fixit_tiff">https://github.com/SLUB-digitalpreservation/fixit_tiff</a> findet ihr ein Werkzeug, welches diese Art der Probleme versucht zu beheben.<br />
<br />
Zur Zeit werden die folgenden falschen Datums-Zeichenketten erkannt und korrigiert:<br />
<br />
<ul>
<li><span style="font-family: "Courier New",Courier,monospace;">'18.03.2010 09:59:17' => '2010:03:18 09:59:17'</span></li>
<li><span style="font-family: "Courier New",Courier,monospace;">'2010-03-18 09:59:17' => '2010:03:18 09:59:17'</span></li>
</ul>
Das <i>datetime</i>-Tag ist <a href="http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf">laut Standard</a> spezifiert als folgende Zeichenkette: 'YYYY:MM:DD hh:mm:ss' wobei<br />
<ul>
<li>YYYY dem vierstelligen Jahr,</li>
<li>MM dem Monat</li>
<li>DD dem Tag</li>
<li>hh den Stunden</li>
<li>mm den Minuten</li>
<li>ss den Sekunden</li>
</ul>
entspricht und ggf. führende Nullen gesetzt werden. <br />
Das Tool kann auch alle Tags, die nicht zum baseline Profil gehören aus den TIFFs entfernen.<br />
<br />
Über Feedback würde ich mich freuen. :)<br />
<br />
<br />
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-65685281972652101702014-06-06T17:47:00.000+02:002014-06-10T13:02:26.469+02:00Exportieren lokales subversion repository nach github<h2>
Warum?</h2>
Da ich intern bisher auf <i>subversion</i> entwickle, Code aber auf <a data-mce-href="http://github.org" href="http://github.org/">GitHub</a> stellen möchte, brauche ich eine¹ Möglichkeit diese Projekte möglichst kompatibel nach <i>git</i> zu exportieren. <i>git-svn</i> erlaubt diese Nutzung und erhält die Versionshistorie. Eine Re-Integration nach <i>subversion</i> ist ebenfalls möglich.<br />
<br />
Die Infos stammen zum Teil aus Tutorial zu <i>git-svn</i> unter <a data-mce-href="http://viget.com/extend/effectively-using-git-with-subversion" href="http://viget.com/extend/effectively-using-git-with-subversion">http://viget.com/extend/effectively-using-git-with-subversion</a>.<br />
<br />
Eine kleine, nette Einführung zu <i>git</i> gibt es unter <a data-mce-href="http://rogerdudler.github.io/git-guide/index.de.html" href="http://rogerdudler.github.io/git-guide/index.de.html">http://rogerdudler.github.io/git-guide/index.de.html</a><br />
<br />
¹ Erm, ja. <i>Github</i> kann auch via <i>subversion</i> Repositories verwalten. Allerdings müsste man dann das Projekt komplett dort hosten. Die obige Lösung umgeht dies.<br />
<br />
<br />
<h2>
git-svn installieren</h2>
<i>git-svn</i> ist unter Debian im gleichnamigen Paket zu finden und mittels<br />
<br />
<blockquote class="tr_bq">
<table class="wysiwyg-macro" data-macro-body-type="PLAIN_TEXT" data-macro-name="code" data-macro-parameters="language=bash" data-mce-style="background-image: url('https://intranet.slub-dresden.de:8443/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9YmFzaH0&locale=de_DE&version=2'); background-repeat: no-repeat;" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9YmFzaH0&locale=de_DE&version=2); background-repeat: no-repeat;"><tbody>
<tr><td class="wysiwyg-macro-body"><pre>$> aptitude install git-svn</pre>
</td></tr>
</tbody></table>
</blockquote>
zu installieren.<br />
Es ist ratsam vor der ersten Verwendung im <i>.bashrc</i> den Suchpfad für <i>git-svn</i> zu hinterlegen, da Debian das Programm unter <i>/usr/lib/git-core/</i> installiert.<br />
<br />
<br />
<h2>
Exportieren von subversion in git Arbeitsverzeichnis</h2>
<br />
Das
jeweilige Projekt, welches exportiert werden soll, sollte vollständig auf dem
Subversionserver vorliegen. Sinnvoll ist es über die URL des Projektes
zu gehen. Im Beispiel wäre das https://localhost/svn/trunk/fixit/fixit_tiff, welches auf das <i>fixit_tiff</i> Repository zeigt.<br />
<br />
Mit folgendem Kommando erzeugt man im /tmp Directory das neue Git-Arbeitsverzeichnis für fixit_tiff:<br />
<br />
<br />
<blockquote class="tr_bq">
<table class="wysiwyg-macro" data-macro-body-type="PLAIN_TEXT" data-macro-name="code" data-macro-parameters="language=bash" data-mce-style="background-image: url('https://intranet.slub-dresden.de:8443/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9YmFzaH0&locale=de_DE&version=2'); background-repeat: no-repeat;" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9YmFzaH0&locale=de_DE&version=2); background-repeat: no-repeat;"><tbody>
<tr><td class="wysiwyg-macro-body"><pre>$> mkdir /tmp/git
$> cd /tmp/git
$> /usr/lib/git-core/git-svn clone https://localhost/svn/trunk/fixit/fixit_tiff ./fixit_tiff</pre>
</td></tr>
</tbody></table>
</blockquote>
Zur Überprüfung können wir mit <i>git log</i> anschauen, ob unsere History etc. korrekt übernommen wurde:<br />
<br />
<blockquote class="tr_bq">
<table class="wysiwyg-macro" data-macro-body-type="PLAIN_TEXT" data-macro-name="code" data-macro-parameters="language=bash" data-mce-style="background-image: url('https://intranet.slub-dresden.de:8443/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9YmFzaH0&locale=de_DE&version=2'); background-repeat: no-repeat;" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9YmFzaH0&locale=de_DE&version=2); background-repeat: no-repeat;"><tbody>
<tr><td class="wysiwyg-macro-body"><pre>$> cd fixit_tiff
$> git log
commit 92f8cf068d7bdf8e2a39aab8e3db31f3c055bcd4
Author: romeyke <romeyke@c63e1d0e-0205-4395-96c5-23d0ee883611>
Date: Wed May 28 15:17:12 2014 +0000
- compiles with debugging code
- added TIFFGetAllTagListCount () because TIFFGetTagListCount() only works w
- added TIFFGetAllTagListEntry () because TIFFGetTagListEntry() only works w
- added print_baseline_tags()
- added print_required_tags()
- added check_required()
- check_*() opens tif-files only in read mode
- improved logic, because we call check*() explicitely, also after repair
git-svn-id: https://localhost/svn/trunk/
commit dd30cfa15101c61111ce62f6e83b0bfee3cb10bb
…</pre>
</td></tr>
</tbody></table>
</blockquote>
<br />
<h2>
Übertragen auf github</h2>
Auf github sollte schon ein entsprechendes Repository angelegt sein. Zuerst müssen wir <i>git</i> nun mitteilen, daß wir auf einen anderen Master gehen:<br />
<br />
<blockquote class="tr_bq">
<table class="wysiwyg-macro" data-macro-body-type="PLAIN_TEXT" data-macro-name="code" data-macro-parameters="language=bash" data-mce-style="background-image: url('https://intranet.slub-dresden.de:8443/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9YmFzaH0&locale=de_DE&version=2'); background-repeat: no-repeat;" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9YmFzaH0&locale=de_DE&version=2); background-repeat: no-repeat;"><tbody>
<tr><td class="wysiwyg-macro-body"><pre>$> export yourusername=maxmustermann
$> export yourreponame=fixit_tiff
$> git remote add origin https://github.com/${yourusername}/${yourreponame}.git
</pre>
</td></tr>
</tbody></table>
</blockquote>
Mit folgendem Kommando vollführen wir dann den Export aus unserem obigen <i>git</i>-Arbeitsverzeichnis:<br />
<br />
<table class="wysiwyg-macro" data-macro-body-type="PLAIN_TEXT" data-macro-name="code" data-macro-parameters="language=bash" data-mce-style="background-image: url('https://intranet.slub-dresden.de:8443/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9YmFzaH0&locale=de_DE&version=2'); background-repeat: no-repeat;" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9YmFzaH0&locale=de_DE&version=2); background-repeat: no-repeat;"><tbody>
<tr><td class="wysiwyg-macro-body"><blockquote class="tr_bq">
<pre>$> git push origin master</pre>
</blockquote>
</td></tr>
</tbody></table>
Bei Problemen schlage man unter <a data-mce-href="http://stackoverflow.com/questions/12799719/how-to-upload-a-project-to-github" href="http://stackoverflow.com/questions/12799719/how-to-upload-a-project-to-github">http://stackoverflow.com/questions/12799719/how-to-upload-a-project-to-github</a> nach <img alt="(Lächeln)" border="0" class="emoticon emoticon-smile" data-emoticon-name="smile" data-mce-src="https://intranet.slub-dresden.de:8443/s/de_DE-1988229788/4394/a32f094df7825f58c6a417309475c6c954804a27.42/_/images/icons/emoticons/smile.png" src="https://intranet.slub-dresden.de:8443/s/de_DE-1988229788/4394/a32f094df7825f58c6a417309475c6c954804a27.42/_/images/icons/emoticons/smile.png" title="(Lächeln)" /><br />
<br />
Meine Repos sind unter <a href="https://github.com/art1pirat/">https://github.com/art1pirat/</a> zu findenUnknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-7081435474583764742014-03-29T19:19:00.000+01:002014-03-29T19:19:08.696+01:00Silbentrennung für Ebooks<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://commons.wikimedia.org/wiki/File%3AISOIEC-9995-7-076--IEC-60417-6073--Symbol-for-Soft-Hyphen.svg" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;" title="By Karl432 (Own work) [CC0], via Wikimedia Commons"><img alt="ISOIEC-9995-7-076--IEC-60417-6073--Symbol-for-Soft-Hyphen" src="//upload.wikimedia.org/wikipedia/commons/thumb/c/c9/ISOIEC-9995-7-076--IEC-60417-6073--Symbol-for-Soft-Hyphen.svg/128px-ISOIEC-9995-7-076--IEC-60417-6073--Symbol-for-Soft-Hyphen.svg.png" width="128" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Soft-Hyphen Keyboard Symbol<br />
Quelle: <a href="http://commons.wikimedia.org/wiki/File:ISOIEC-9995-7-076--IEC-60417-6073--Symbol-for-Soft-Hyphen.svg">Wikipedia, CC0</a></td></tr>
</tbody></table>
Ja, der Titel ist geklaut. Vor ca. zwei Wochen war ich wieder einmal auf den <a href="http://chemnitzer.linux-tage.de/">Chemnitzer Linuxtagen</a> und bin dort auf den <a href="http://chemnitzer.linux-tage.de/2014/de/vortraege/detail/157">Vortrag von Georg Pfeiffer »Perfekte Silbentrennung in E-Books mit präreformatorischen Texten«</a> gestoßen.<br />
<br />
Da ich ja ua. die »<a href="http://art1pirat.blogspot.de/2014/01/und-die-bilder.html">Bunte Bilder aus dem Sachſenlande</a>« als E-Book aufbereite, benötige ich für meine Texte ebenfalls eine "perfekte" Silbentrennung. Georg hat in seinem Vortrag auf das Projekt »<a href="http://projekte.dante.de/Trennmuster">Trennmuster</a>« der TeX-Leute hingewiesen. Das hat mich neugierig gemacht.<br />
<br />
Nach dem Herunterladen des Projektes (was sehr lange dauert, da die Wortlisten knapp 15MB groß sind) mittels<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">$> git clone git://repo.or.cz/wortliste.git</span><br />
<br />
findet man die Trennmuster in den Dateien <i>pre-1901</i> und <i>wortliste</i>. Die letztere ist für mich eher uninteressant, da diese nur Wörter nach den jeweiligen Rechtschreibreformen enthält. Die <i>pre-1901</i> ist recht einfach aufgebaut, hier ein Auszug:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">aber<mah-li-gen<br />ab<füh-re-ten<br />ab<ge<fer-ti-get<br />ab<ge<than<br />ab<ge<theilt<br />ab<hoh-len<br />ab<thei-len<br />ab<theil-ten<br />Ab<thei-lung<br />Ab<thei-lun-gen</span> </blockquote>
<blockquote class="tr_bq">
…</blockquote>
<br />
<br />
Das Zeichen '<span style="font-family: "Courier New",Courier,monospace;"><</span>' bezeichnet die Trennung, falls es sich um eine Vorsilbe handelt. Das Zeichen '<span style="font-family: "Courier New",Courier,monospace;">-</span>' gibt eine normale Trennung an, das Zeichen '<span style="font-family: "Courier New",Courier,monospace;">=</span>' (im Beispiel nicht vorhanden) eine Trennung zwischen zusammengesetzten Worten.<br />
<br />
Für ein Ebook sind mir diese unterschiedlichen Trennungen egal, so das ich, wie Georg, an all den Trennstellen ein <a href="http://de.wikipedia.org/wiki/Weiches_Trennzeichen">Weiches Trennzeichen</a> setzen möchte. Unicode kennt solch ein Zeichen als Code <i>U+00AD</i>. Als HTML-Entität wäre es <i>&shy;</i>. Das weiche Trennzeichen erlaubt es, Trennanweisungen zu kodieren, für den Fall, daß das Anzeigeprogramm gezwungen ist, den Text umzubrechen. Es ist also nur an Zeilenumbrüchen als Trennzeichen zu erkennen und sonst im Text unsichtbar.<br />
<br />
In meinem Perlscript zur Verarbeitung des Roh-Textes zu einem eigenen <a href="http://de.wikipedia.org/wiki/AsciiDoc">Asciidoc</a> lese ich die Datei <i>pre-1901</i> ein, es entsteht ein Hash <span style="font-family: "Courier New",Courier,monospace;">%hyphens</span>, der als Schlüssel das ungetrennte Wort verwendet und als Wert die getrennte Version mit weichen Trennzeichen. Dabei werden nicht die Feinheiten, die mit der Trennmuster-Datei möglich wäre unterschieden, sondern eine vereinfachte Variante kodiert.<br />
Aus '<span style="font-family: "Courier New",Courier,monospace;">ab<thei-len</span>' würde also der Schlüssel '<span style="font-family: "Courier New",Courier,monospace;">abtheilen</span>' und die Trennvariante (hier mit '-' statt Unicode) '<span style="font-family: "Courier New",Courier,monospace;">ab-thei-len</span>' als Wert entstehen.<span style="font-family: "Courier New",Courier,monospace;"><br /></span><br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">sub find_hyphens {<br /> my $filename="hints/pre-1901";<br /> open (my $fh, "<", "$filename");<br /> binmode $fh, ":utf8";<br /> while (<$fh>) {<br /> chomp;<br /> # replace '-' to &shy; <br /> s#([a-z])-$#$1\x{00ad}#g; # &shy; U+00AD<br /> my $hyphenized=$_; # simplifed hyphenized</span> <br />
<span style="font-family: "Courier New",Courier,monospace;"> $hyphenized=~s/[<>=-]/\x{00ad}/g;</span> <span style="font-family: "Courier New",Courier,monospace;"><br /> my $orig=$_;<br /> $orig=~s/[<>=-]//g; # original, dehyphenized word<br /> $hyphens{$orig}=$hyphenized;<br /> }<br /> close $fh;<br />}</span></blockquote>
<br />
Im weiteren Programm bekomme ich die Textzeilen zeilenweise übergeben. Mit folgendem Snippet lese ich dann die Wörter und ersetze sie durch ihre weich-getrennte Version:
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;"># inject hyphens (for ebooks)<br /> foreach my $word (keys %hyphens) {<br /> my $hyphenized = $hyphens{$word};<br /> s#\b$word\b#$hyphenized#g;<br /> }</span></blockquote>
Voila!<br />
<br />
Als Nebeneffekt bekommt das Trennzeichenprojekt meine Wortliste aus dem Buchprojekt. Auf alle Fälle war diese Erfahrung ein gutes Beispiel dafür, wie man sich in der Welt der Freien Software gegenseitig befruchten kann. Danke für die Idee an Georg!<br />
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-12625165154428838712014-01-31T23:14:00.000+01:002014-01-31T23:14:07.386+01:00Und die Bilder?Das Buch „<a href="http://art1pirat.blogspot.de/2013/06/teil-9-selbstversuch-ebook-befreiung-am.html">Bunte Bilder aus dem Sachſenlande</a>“ habe ich nun soweit vollkorrigiert und bin gerade dabei alles zusammenzustellen, damit in der nächsten Stufe über <a href="http://www.methods.co.nz/asciidoc/">asciidoc</a>, <a href="http://www.docbook.org/">docbook-xml</a> ein <a href="http://de.wikipedia.org/wiki/EPUB">EPub</a> oder <a href="http://de.wikipedia.org/wiki/LaTeX">LaTeX</a> Dokument erstellt werden kann.<br />
<br />
Zurzeit bin ich noch am überlegen, wie ich mit Bildern umgehe. Verwende ich die Bilder direkt aus dem Original? Oder bearbeite ich diese nach und <a href="http://art1pirat.blogspot.de/2013/06/binarisierung.html">monochromisiere</a> sie? <a href="http://de.wikipedia.org/wiki/Freistellung_%28Bild%29">Stelle ich sie frei</a>? Verwende ich <a href="http://de.wikipedia.org/wiki/Portable_Network_Graphics">PNG</a> oder vectorisiere ich die Bilder um diese dann als <a href="http://de.wikipedia.org/wiki/Scalable_Vector_Graphics">SVG</a> abzuspeichern?<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-BHmiW3bgUaY/UuwcFQUNN4I/AAAAAAAAAg8/zMgEb4Tn8bY/s1600/00_Carola.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="http://1.bp.blogspot.com/-BHmiW3bgUaY/UuwcFQUNN4I/AAAAAAAAAg8/zMgEb4Tn8bY/s1600/00_Carola.png" height="320" width="259" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Königin Carola von Sachſen,<br />
Protektorin des <a href="https://portal.dnb.de/opac.htm?method=showFullRecord&currentResultId=S%C3%A4chsischer+Pestalozzi+Verein%26any&currentPosition=7">Peſtalozzi-Vereins</a></td><td class="tr-caption" style="text-align: center;"></td><td class="tr-caption" style="text-align: center;"></td><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Ich bin mir hierbei noch nicht sicher. Habt ihr Vorschläge? Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-35209148225717777092013-12-25T10:30:00.003+01:002013-12-25T10:30:58.754+01:00Was Training so ausmacht<br />
Bin dank <a href="https://twitter.com/cneudecker">Clemens Neudecker</a> auf das im Rahmen des <a href="http://succeed-project.eu/">succeed</a> Projektes entwickelte Tool <a href="https://bintray.com/version/readme/impactocr/maven/ocrevalUAtion/1.2.0">ocrevalUAtion</a> gestoßen. Damit kann man seine OCR-Ergebnisse mit dem Original vergleichen und bekommt eine Übersicht über die typischen OCR-Fehler.<br />
<br />
Ich habe mal eine Seite aus <a href="http://art1pirat.blogspot.de/2013/06/teil-9-selbstversuch-ebook-befreiung-am.html">Bunte Bilder aus dem Sachſenlande</a> genommen und hier sind die Werte für untrainiertes Tesseract 3.02.03 mit dem mitgelieferten "<i>deu-frak</i>":<br />
<br />
<br />
<table border="1"><tbody>
<tr><td>CER</td><td>7,74</td>
</tr>
<tr>
<td>CER-DL</td><td>7,74</td>
</tr>
<tr>
<td>WER</td><td>27,65</td>
</tr>
<tr>
<td>WER (bag of words)</td><td>27,43</td></tr>
</tbody></table>
<pre id="line1"><span class="error" title="Stray end tag “tbody”."> </span></pre>
Dabei bedeutet CER: <i>Character error rate</i>, CER-DL: <i>Character error rate</i> nach <a href="http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance">Damerau-Levenshtein</a> und WER: <i>Word error rate</i>.<br />
<br />
Hier sind also nur knapp 92% aller Zeichen richtig und gar nur 72% aller Wörter.<br />
<br />
Nun die im Laufe des <i>Bunte Bilder</i> Projektes auf den Buchtitel trainierte Variante:<br />
<br />
<table border="1"><tbody>
<tr><td>CER</td><td>2,83</td>
</tr>
<tr>
<td>CER-DL</td><td>2,83</td>
</tr>
<tr>
<td>WER</td><td>7,78</td>
</tr>
<tr>
<td>WER (bag of words)</td><td>9,07</td></tr>
</tbody></table>
<br />
Es sind nun 97% aller Zeichen richtig und fast 91% aller Wörter! Fazit: Trainieren lohnt sich!<br />
<br />
Dies deckt sich auch mit den Berechnung aus meinem früheren Beitrag "<a href="http://art1pirat.blogspot.de/2013/06/ocr-qualitat-bestimmen.html">OCR Qualität bestimmen</a>" bzw. aus <a href="http://art1pirat.blogspot.de/2013/06/teil-9-selbstversuch-ebook-befreiung-am.html">Teil 9</a>, wo die Worterkennungsrate 93% betrug.<br />
<br />
Das Tool berechnet aber auch für jedes vorkommende Zeichen die Fehlerwahrscheinlichkeit, was hilft sein Augenmerk auf diese typischen Probleme zu lenken. Hier ein Beispiel des untrainierten <i>Tesseract</i>. Ins Auge fällt, daß dies (wie bereits beschrieben) kein langes-s erkennt. Sichtbar sind auch die Problemzeichen '<i>n</i>', '<i>u</i>' und '<i>ü</i>': <br />
<br />
<h4>
Error rate per character and type</h4>
<table border="1"><tbody>
<tr>
<td>Character</td><td>Hex code</td><td>Total</td><td>Spurious</td><td>Confused</td><td>Lost</td><td>Error rate</td>
</tr>
<tr>
<td> </td><td>20</td><td>463</td><td>2</td><td>0</td><td>1</td><td>0,65</td>
</tr>
<tr>
<td>!</td><td>21</td><td>0</td><td>1</td><td>0</td><td>0</td><td>Infinity</td>
</tr>
<tr>
<td>"</td><td>22</td><td>0</td><td>1</td><td>0</td><td>0</td><td>Infinity</td>
</tr>
<tr>
<td>)</td><td>29</td><td>2</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>*</td><td>2a</td><td>2</td><td>0</td><td>1</td><td>0</td><td>50,00</td>
</tr>
<tr>
<td>,</td><td>2c</td><td>33</td><td>1</td><td>4</td><td>2</td><td>21,21</td>
</tr>
<tr>
<td>-</td><td>2d</td><td>6</td><td>0</td><td>2</td><td>0</td><td>33,33</td>
</tr>
<tr>
<td>.</td><td>2e</td><td>29</td><td>0</td><td>1</td><td>3</td><td>13,79</td>
</tr>
<tr>
<td>1</td><td>31</td><td>6</td><td>1</td><td>0</td><td>0</td><td>16,67</td>
</tr>
<tr>
<td>2</td><td>32</td><td>4</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>5</td><td>35</td><td>4</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>8</td><td>38</td><td>3</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>9</td><td>39</td><td>5</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>A</td><td>41</td><td>6</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>B</td><td>42</td><td>11</td><td>0</td><td>1</td><td>0</td><td>9,09</td>
</tr>
<tr>
<td>D</td><td>44</td><td>10</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>E</td><td>45</td><td>6</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>F</td><td>46</td><td>9</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>G</td><td>47</td><td>6</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>H</td><td>48</td><td>6</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>I</td><td>49</td><td>4</td><td>0</td><td>4</td><td>0</td><td>100,00</td>
</tr>
<tr>
<td>J</td><td>4a</td><td>5</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>K</td><td>4b</td><td>8</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>L</td><td>4c</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>M</td><td>4d</td><td>5</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>N</td><td>4e</td><td>4</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>O</td><td>4f</td><td>2</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>P</td><td>50</td><td>3</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>R</td><td>52</td><td>7</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>S</td><td>53</td><td>26</td><td>0</td><td>3</td><td>0</td><td>11,54</td>
</tr>
<tr>
<td>T</td><td>54</td><td>5</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>U</td><td>55</td><td>4</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>V</td><td>56</td><td>7</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>W</td><td>57</td><td>7</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>Z</td><td>5a</td><td>7</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>a</td><td>61</td><td>123</td><td>0</td><td>2</td><td>0</td><td>1,63</td>
</tr>
<tr>
<td>b</td><td>62</td><td>41</td><td>0</td><td>1</td><td>0</td><td>2,44</td>
</tr>
<tr>
<td>c</td><td>63</td><td>66</td><td>0</td><td>1</td><td>0</td><td>1,52</td>
</tr>
<tr>
<td>d</td><td>64</td><td>110</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>e</td><td>65</td><td>430</td><td>0</td><td>4</td><td>1</td><td>1,16</td>
</tr>
<tr>
<td>f</td><td>66</td><td>40</td><td>0</td><td>5</td><td>0</td><td>12,50</td>
</tr>
<tr>
<td>g</td><td>67</td><td>71</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>h</td><td>68</td><td>121</td><td>0</td><td>4</td><td>0</td><td>3,31</td>
</tr>
<tr>
<td>i</td><td>69</td><td>178</td><td>23</td><td>0</td><td>0</td><td>12,92</td>
</tr>
<tr>
<td>j</td><td>6a</td><td>3</td><td>4</td><td>0</td><td>0</td><td>133,33</td>
</tr>
<tr>
<td>k</td><td>6b</td><td>21</td><td>0</td><td>1</td><td>0</td><td>4,76</td>
</tr>
<tr>
<td>l</td><td>6c</td><td>91</td><td>2</td><td>0</td><td>0</td><td>2,20</td>
</tr>
<tr>
<td>m</td><td>6d</td><td>64</td><td>0</td><td>19</td><td>0</td><td>29,69</td>
</tr>
<tr>
<td>n</td><td>6e</td><td>249</td><td>7</td><td>7</td><td>0</td><td>5,62</td>
</tr>
<tr>
<td>o</td><td>6f</td><td>48</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>p</td><td>70</td><td>11</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>r</td><td>72</td><td>148</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>s</td><td>73</td><td>37</td><td>2</td><td>0</td><td>0</td><td>5,41</td>
</tr>
<tr>
<td>t</td><td>74</td><td>133</td><td>0</td><td>1</td><td>0</td><td>0,75</td>
</tr>
<tr>
<td>u</td><td>75</td><td>105</td><td>0</td><td>11</td><td>1</td><td>11,43</td>
</tr>
<tr>
<td>v</td><td>76</td><td>18</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>w</td><td>77</td><td>31</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>x</td><td>78</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>y</td><td>79</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>z</td><td>7a</td><td>38</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>«</td><td>ab</td><td>0</td><td>1</td><td>0</td><td>0</td><td>Infinity</td>
</tr>
<tr>
<td>»</td><td>bb</td><td>0</td><td>1</td><td>0</td><td>0</td><td>Infinity</td>
</tr>
<tr>
<td>Ä</td><td>c4</td><td>2</td><td>0</td><td>1</td><td>0</td><td>50,00</td>
</tr>
<tr>
<td>ß</td><td>df</td><td>7</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>ä</td><td>e4</td><td>13</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>ö</td><td>f6</td><td>11</td><td>0</td><td>0</td><td>0</td><td>0,00</td>
</tr>
<tr>
<td>ü</td><td>fc</td><td>21</td><td>0</td><td>9</td><td>0</td><td>42,86</td>
</tr>
<tr>
<td>ſ</td><td>17f</td><td>90</td><td>0</td><td>90</td><td>0</td><td>100,00</td>
</tr>
<tr>
<td>–</td><td>2013</td><td>2</td><td>0</td><td>2</td><td>0</td><td>100,00</td>
</tr>
<tr>
<td>—</td><td>2014</td><td>0</td><td>1</td><td>0</td><td>0</td><td>Infinity</td>
</tr>
<tr>
<td>“</td><td>201c</td><td>3</td><td>0</td><td>3</td><td>0</td><td>100,00</td>
</tr>
<tr>
<td>„</td><td>201e</td><td>3</td><td>0</td><td>3</td><td>0</td><td>100,00</td></tr>
</tbody></table>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-11079272263842338512013-12-22T18:53:00.001+01:002013-12-22T18:53:46.308+01:00Holzweibchen – Sage aus dem VogtlandeNach längerer Zeit will ich mit der Sage „Holzweibchen“ von <a href="http://www.thueringer-literaturrat.de/index.php?pageid=14&unitid=2972&PHPSESSID=p1b9gktn8kgmlcks27s094vgp4">Karl Völkel (1869-1934)</a> die Wartezeit etwas verkürzen. Sie stammt in der Fassung aus „<a href="http://art1pirat.blogspot.de/2013/06/teil-9-selbstversuch-ebook-befreiung-am.html">Bunte Bilder aus dem Sachſenlande</a>“ (Bd. I, 1902, Neunte Auflage, S.303), welches ich immer noch korrigiere.<br />
<div class="fraktur" style="font-family: 'UnifrakturMaguntia';">
<h1>
Holzweibchen.</h1>
<h2>
Sage aus dem Vogtlande.</h2>
Es ſtand eine Mühl’ im Elſtergrund,<br />
Ein ſtattliches Gebäude;<br />
Mit dem ſich keins vergleichen kunnt’<br />
Wohl in der Näh’ und Weite.<br />
Drin hauſt ein wackeres Geſchlecht;<br />
Kein Schimpfwort durften Magd und Knecht,<br />
Kein Fluchwort je gebrauchen.<br />
<br />
Da ſtund die Wirtſchaft o, ſo blank,<br />
Als hätt’ es Glück geregnet! —<br />
Die Müllersleute wußten’s Dank<br />
Dem Herrn, der Fromme ſegnet;<br />
Die Nachbarn aber um ſie her<br />
Erzählten ſich die ſelt’ne Mär:<br />
Holzweibchen ſein’s, die hälfen.<br />
<br />
Doch weh, es ſtarb die Müllerin! –<br />
Und als die Zeit gekommen,<br />
Der Müller hat nach ſeinem Sinn<br />
Ein’ andre ſich genommen.<br />
Die ſtammt’ aus reichem Herrenhaus;<br />
Bei Saitenſpiel und Tanz und Schmaus<br />
Hat Einzug ſie gehalten!<br />
<br />
Gar andre Wirtſchaft die begann,<br />
War feindlich frommen Sprüchen,<br />
Hing allem ihren Tadel an,<br />
Gebot mit Schimpf und Flüchen.<br />
Und rückwärts in der Mühle ging’s,<br />
Und alle Leut’ erzählten rings:<br />
Die Weibchen ſei’n — verſchwunden!<br />
<br />
<author>Karl Völkel.
</author>
</div>
<br />
<br />
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-36022208277559132662013-10-19T17:38:00.001+02:002013-10-19T17:38:38.305+02:00Schnell mal Zeilen zusammenziehenHeute bekam ich eine Email mit der Bitte zu erklären, wie man aus den Textdateien die Zeilen mit den Wortumbrüchen zusammenziehen kann.<br />
<br />
Sprich, wenn ich eine Textdatei <i>foo.txt</i> habe, die so aussieht:<br />
<blockquote class="tr_bq">
<span style="font-family: Times,"Times New Roman",serif;">halli-<br />hallo<br />wasser<br />bad</span></blockquote>
sollen "halli-" und "hallo" zusammengezogen werden zu "hallihallo".<br />
<br />
Hier ein Beispiel mit <i>sed</i>:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">$> cat foo.txt | sed -e "N; s/-\n//g" > bar.txt</span></blockquote>
Das Ergebnis ist die Textdatei <i>bar.txt</i>:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: Times,"Times New Roman",serif;">hallihallo<br />wasser<br />bad</span></blockquote>
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-91640705426849328732013-09-15T20:13:00.000+02:002013-09-15T20:13:17.628+02:00Leipzig, Augustusplatz (Anfang 19. Jahrhundert)<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-ow8QtU_0qsU/UjX3fakt9hI/AAAAAAAAAfI/efd-2JCQ804/s1600/Leipzig_BunteBilder.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="452" src="http://3.bp.blogspot.com/-ow8QtU_0qsU/UjX3fakt9hI/AAAAAAAAAfI/efd-2JCQ804/s640/Leipzig_BunteBilder.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption">Augustusplatz, Leipzig, aus »<a href="http://art1pirat.blogspot.de/2013/06/teil-9-selbstversuch-ebook-befreiung-am.html">Bunte Bilder aus dem Sachsenlande</a>«, Bd. I, 1902, Neunte Auflage, S.173</td></tr>
</tbody></table>
<br /><br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-44257923981266254782013-08-27T13:55:00.001+02:002013-09-13T15:55:08.294+02:00baseline TIFF – Versuch einer Rekonstruktion, Teil1<h2>
Vorwort</h2>
Im Artikel »<a href="http://art1pirat.blogspot.de/2013/07/baseline-tiff.html">baseline TIFF</a>« bin ich auf den Aufbau des TIFF-Formates eingegangen. Um die Eignung von TIFF-Dateien als Bildformat für die <a href="http://de.wikipedia.org/wiki/Langzeitverf%C3%BCgbarkeit">Langzeitverfügbarkeit</a> (bzw. Langzeitarchivierung) zu testen, habe ich das Bild aus dem Beitrag genommen, leicht geändert und mit einem <a href="http://de.wikipedia.org/wiki/Fuzzing">Fuzzing</a>-Tool bitweise zerstört.<br />
<br />
Als Werkzeug habe ich <a href="http://caca.zoy.org/wiki/zzuf">zzuf</a> genutzt, welches ich angewiesen habe, 1‰ aller Bits des Original-Bildes zufällig zu verändern.<br />
<blockquote class="tr_bq">
<span style="font-size: x-small;"><span style="font-family: Courier New, Courier, monospace;">$> zzuf -c -s87423 -r0.001 <example_tiff.tiff >fuzzy-0.001.tiff<br />$> display fuzzy-0.001.tiff</span> </span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">display.im6: fuzzy-0.001.tiff: invalid TIFF directory; tags are not sorted in ascending order. `TIFFReadDirectory' @ warning/tiff.c/TIFFWarnings/768.<br />display.im6: fuzzy-0.001.tiff: unknown field with tag 275 (0x113) encountered. `TIFFReadDirectory' @ warning/tiff.c/TIFFWarnings/768.<br />display.im6: fuzzy-0.001.tiff: unknown field with tag 16663 (0x4117) encountered. `TIFFReadDirectory' @ warning/tiff.c/TIFFWarnings/768.<br />display.im6: fuzzy-0.001.tiff: TIFF directory is missing required "StripOffsets" field. `MissingRequired' @ error/tiff.c/TIFFErrors/508.</span></blockquote>
<h2>
Versuch einer Rekonstruktion des Image File Directory (IFD)</h2>
<div>
Versuchen wir das Bild zu rekonstruieren. Zur Erinnerung hier nochmal der Aufbau eines TIFFs:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-Qr-40FdkGAw/UfkFx5J384I/AAAAAAAAAd4/gpKaL2GINrE/s1600/tiff_vortrag__1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://4.bp.blogspot.com/-Qr-40FdkGAw/UfkFx5J384I/AAAAAAAAAd4/gpKaL2GINrE/s320/tiff_vortrag__1.png" height="320" width="218" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Aufbau TIFF</td></tr>
</tbody></table>
</div>
<div>
Das kaputte TIFF-Bild sieht als Hexdump so aus:</div>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000000 49 49 2a 00 28 03 00 00 00 00 00 00 00 00 00 00 |II*.(...........|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">*</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000050 00 00 00 00 00 00 00 00 00 00 00 0c 00 00 00 0c |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000060 00 00 00 0c 00 00 00 0c 00 00 00 0c 00 00 00 0c |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000070 00 00 00 01 00 00 00 09 00 00 00 04 00 00 00 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000080 00 00 00 05 00 00 00 0c 00 00 00 0c 00 00 00 0c |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000090 00 00 00 0c 00 00 00 00 00 00 00 0c 00 00 00 0c |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000000a0 00 00 00 0c 00 00 00 0c 00 00 00 f6 00 00 00 f6 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000000b0 00 00 00 fa 00 00 00 ff 00 00 00 f6 00 00 00 f6 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000000c0 00 00 00 1a 00 00 00 d5 00 00 00 54 00 00 00 00 |...........T....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000000d0 00 00 00 75 00 00 00 ff 00 00 00 f5 00 00 00 f5 |...u............|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000000e0 00 00 00 ef 00 00 00 00 00 00 00 ff 00 00 00 f4 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000000f0 00 00 00 f5 00 00 00 f5 00 00 00 00 00 00 00 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000100 10 00 00 28 00 00 00 e3 00 00 00 00 00 00 00 00 |...(............|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000110 00 00 00 00 00 00 00 cb 00 00 00 51 00 00 00 00 |...........Q....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000120 00 00 00 70 00 00 00 af 00 00 00 01 00 00 00 01 |...p............|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000130 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000140 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000150 00 00 00 34 00 00 00 e4 00 00 00 00 00 00 00 00 |...4............|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000160 00 00 00 00 00 00 00 cb 00 00 00 51 00 00 00 00 |...........Q....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000170 10 00 00 70 00 00 00 da 00 00 00 8b 00 00 00 8c |...p............|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000180 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 88 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000190 00 00 00 8b 00 00 00 3d 00 00 00 00 00 00 00 00 |.......=........|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000001a0 00 00 00 34 00 00 00 e4 00 00 00 00 00 00 00 00 |...4............|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000001b0 00 00 00 00 00 00 00 cb 00 00 00 51 00 00 00 00 |...........Q....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000001c0 00 00 00 70 00 00 00 ce 00 00 00 63 00 00 00 63 |...p.......c...c|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000001d0 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00 5f |..............._|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000001e0 00 00 00 63 00 00 00 2b 00 00 00 00 00 00 00 00 |...c...+........|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000001f0 00 00 00 35 00 00 00 e8 00 00 00 00 00 00 00 00 |...5............|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000200 00 00 00 00 00 00 00 cf 00 00 00 52 00 00 00 00 |...........R....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000210 00 00 00 72 00 00 00 af 00 00 00 00 00 00 00 00 |...r............|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000220 00 00 00 00 00 00 01 00 20 00 00 ff 00 00 00 00 |........ .......|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000240 00 00 00 2c 00 00 00 c2 00 00 00 00 00 00 00 00 |...,............|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000250 00 00 00 00 00 00 00 ad 00 00 00 44 00 00 00 00 |...........D....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000260 00 00 00 5f 00 00 00 94 00 00 00 00 00 00 00 00 |..._............|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000270 00 00 00 00 00 00 00 00 00 00 00 e7 00 00 00 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000290 00 00 00 0e 00 00 00 3c 00 00 00 00 00 00 00 00 |.......<........|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000002a0 00 00 00 00 00 00 00 35 00 00 00 15 00 00 00 00 |.......5........|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003b0 00 00 00 1d 00 00 00 2e 00 00 00 00 00 00 00 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000002c0 00 00 00 00 00 00 00 00 00 00 00 47 00 00 00 00 |...........G....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000002d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">*</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000310 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000320 00 00 00 00 00 00 00 00 12 00 fe 00 04 00 01 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000330 00 00 00 00 00 00 00 01 03 00 01 00 00 00 14 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000340 00 00 01 01 03 00 01 00 00 00 0a 00 00 00 02 01 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000350 03 00 04 00 00 00 06 04 00 00 03 01 03 00 01 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000360 00 00 01 00 00 00 06 01 03 00 01 00 00 00 02 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000370 00 00 0d 01 02 00 2a 00 00 00 0e 04 00 00 06 01 |......*.........|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000380 02 00 0e 00 00 00 38 04 00 00 13 01 04 00 01 00 |......8.........|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000390 00 00 08 00 00 00 12 01 03 00 01 00 00 00 01 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003a0 00 00 15 01 03 00 01 00 00 00 04 00 00 00 16 01 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003b0 03 00 01 00 00 00 40 00 00 00 17 41 04 00 01 00 |......@....A....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003c0 00 00 20 03 00 00 1a 01 05 00 01 00 00 00 46 04 |.. ...........F.|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003d0 00 00 1b 01 05 00 01 00 00 00 4e 04 00 00 1c 01 |..........N.....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003e0 03 00 01 00 00 00 01 00 00 00 28 01 03 00 01 00 |..........(.....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003f0 00 00 02 00 00 00 52 01 03 00 01 00 00 00 01 00 |......R.........|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000400 00 00 00 00 00 00 08 00 08 00 08 00 08 00 2f 68 |............../h|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000410 6f 6d 65 2f 72 6f 6d 65 79 6b 65 2f 44 6f 6b 75 |ome/romeyke/Doku|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000420 6d 65 6e 74 65 2f 65 78 61 6d 70 6c 65 5f 74 69 |mente/example_ti|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000430 66 66 2e 74 69 66 66 00 54 65 73 74 62 69 6c 64 |ff.tiff.Testbild|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000440 20 54 49 46 46 00 00 00 00 48 00 00 00 01 00 00 | TIFF....H......|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000450 00 48 00 00 00 01 |.H....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000456</span></blockquote>
<div>
<br /></div>
<div>
Schauen wir uns zu erst die 8 Bytes des Headers an. Das einzig Kritische könnte ein zerstörter Offset zum IFD sein:</div>
<div>
<br /></div>
<div>
<span style="font-family: 'Courier New', Courier, monospace;"><span style="font-size: x-small;">00000000 49 49 2a 00 28 03 00 00 00 00 00 00 00 00 00 00 |II*.(...........|</span></span></div>
<div>
<br /></div>
<div>
<span style="font-family: inherit;">Die ersten zwei Bytes sind in Ordnung, da sie nur zwei Werte annehmen können:</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">0x4949</span> little endian (least significant to most significant byte) </div>
<div>
<span style="font-family: Courier New, Courier, monospace;">0x4d4d</span> big endian (most significant to least significant byte)</div>
<div>
<br /></div>
<div>
Die nächsten zwei Bytes stellen die Zahl 42 in jeweiliger Endianess dar:<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> </span><span style="font-family: Courier New, Courier, monospace;">2a 00</span><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> </span><span style="font-family: inherit;">ist also auch in Ordnung.</span></div>
<div>
<span style="font-family: inherit;"><br /></span></div>
<div>
Die Bytes 4-7 zeigen auf das erste Image File Directory (IFD), hier die Adresse <span style="font-family: Courier New, Courier, monospace;">0x0000 0328</span>. </div>
<div>
Kann dieser Wert stimmen?</div>
<div>
<br /></div>
<div>
Von IFDs wissen wir, daß diese wie folgt aufgebaut sind:</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-9waEH_BhU3Y/UfkFx7T_ZgI/AAAAAAAAAeE/mjFp_ibBt-8/s1600/tiff_vortrag__2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://4.bp.blogspot.com/-9waEH_BhU3Y/UfkFx7T_ZgI/AAAAAAAAAeE/mjFp_ibBt-8/s400/tiff_vortrag__2.png" height="306" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Aufbau Image File Directory (IFD) in TIFF-Datei</td></tr>
</tbody></table>
<div>
An der Adresse <span style="font-family: Courier New, Courier, monospace;">0x0328</span> stehen ff. Werte: </div>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000320 00 00 00 00 00 00 00 00 12 00 fe 00 04 00 01 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000330 00 00 00 00 00 00 00 01 03 00 01 00 00 00 14 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000340 00 00 01 01 03 00 01 00 00 00 0a 00 00 00 02 01 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000350 03 00 04 00 00 00 06 04 00 00 03 01 03 00 01 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000360 00 00 01 00 00 00 06 01 03 00 01 00 00 00 02 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000370 00 00 0d 01 02 00 2a 00 00 00 0e 04 00 00 06 01 |......*.........|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000380 02 00 0e 00 00 00 38 04 00 00 13 01 04 00 01 00 |......8.........|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000390 00 00 08 00 00 00 12 01 03 00 01 00 00 00 01 00 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003a0 00 00 15 01 03 00 01 00 00 00 04 00 00 00 16 01 |................|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003b0 03 00 01 00 00 00 40 00 00 00 17 41 04 00 01 00 |......@....A....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003c0 00 00 20 03 00 00 1a 01 05 00 01 00 00 00 46 04 |.. ...........F.|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003d0 00 00 1b 01 05 00 01 00 00 00 4e 04 00 00 1c 01 |..........N.....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003e0 03 00 01 00 00 00 01 00 00 00 28 01 03 00 01 00 |..........(.....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">000003f0 00 00 02 00 00 00 52 01 03 00 01 00 00 00 01 00 |......R.........|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000400 00 00 00 00 00 00 08 00 08 00 08 00 08 00 2f 68 |............../h|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000410 6f 6d 65 2f 72 6f 6d 65 79 6b 65 2f 44 6f 6b 75 |ome/romeyke/Doku|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000420 6d 65 6e 74 65 2f 65 78 61 6d 70 6c 65 5f 74 69 |mente/example_ti|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000430 66 66 2e 74 69 66 66 00 54 65 73 74 62 69 6c 64 |ff.tiff.Testbild|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000440 20 54 49 46 46 00 00 00 00 48 00 00 00 01 00 00 | TIFF....H......|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000450 00 48 00 00 00 01 |.H....|</span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">00000456</span></blockquote>
<br />
Die Anzahl der Tags ergibt sich aus den Bytes 0x0328 und 0x0329 mit Wert 0x12 und 0x00, was für 18 Einträge steht. Dieser Wert klingt erstmal plausibel. Wir wissen, daß jedes Tag 12 Byte groß ist und im baseline-TIFF der <i>nextIFD</i>-Eintrag aus 4Bytes mit dem Wert 0x00 besteht. Schauen wir also an die Adresse 0x0328+2+12*18 = 0x402. Dort stehen 4 mal die Werte 0x00. Sieht erst einmal korrekt aus.<br />
<br />
Wir können also annehmen, daß das IFD korrekt ist. Jeder Eintrag im IFD besteht ja aus 12 Bytes und ist wie folgt aufgebaut:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-wKhvsq4CFHE/UfkFxyy9owI/AAAAAAAAAeI/FuH02zP7vUI/s1600/tiff_vortrag__3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://3.bp.blogspot.com/-wKhvsq4CFHE/UfkFxyy9owI/AAAAAAAAAeI/FuH02zP7vUI/s640/tiff_vortrag__3.png" height="107" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tag-Eintrag</td></tr>
</tbody></table>
Aus dem Artikel zu baseline TIFF wissen wir, daß die Tags in ihrer Nummer (ID) aufsteigend sortiert sind. Lesen wir dazu jeweils die 2 Bytes mit Offset n*12:<br />
<div>
<ul>
<li>1<span style="font-family: Courier New, Courier, monospace;">. 0x32a: 0xfe 0x00 -> 254</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">2. 0x336: 0x00 0x01 -> 64</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">3. 0x342: 0x01 0x01 -> 257</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">4. 0x34e: 0x02 0x01 -> 258</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">5. 0x35a: 0x03 0x01 -> 259</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">6. 0x366: 0x06 0x01 -> 262</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">7. 0x372: 0x0d 0x01 -> 269</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">8. 0x37e: 0x06 0x01 -> 262</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">9. 0x38a: 0x13 0x01 -> 275</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">10.0x396: 0x12 0x01 -> 274</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">11.0x3a2: 0x15 0x01 -> 277</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">12.0x3ae: 0x16 0x01 -> 278</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">13.0x3ba: 0x17 0x41 -> 16663</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">14.0x3c6: 0x1a 0x01 -> 282</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">15.0x3d2: 0x1b 0x01 -> 283</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">16.0x3de: 0x1c 0x01 -> 284</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">17.0x3ea: 0x28 0x01 -> 296</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">18.0x3f6: 0x52 0x01 -> 338</span></li>
</ul>
</div>
<div>
<br /></div>
<div>
Ins Auge fallen die Tags 2, 6, 8, 13 u. 18. Insbesondere Tag 2 und 13 können nicht stimmen, da sie krass die Sortierung verletzten. Eventuell müssen wir die Tags 6-10 nochmal prüfen.</div>
<div>
<br /></div>
<div>
Der Tag 2 an Adresse 0x336 müsste einen Wert um die 250 enthalten.Sehr wahrscheinlich ist, daß er statt 0x00 0x01 die Folge 0x01 0x00 enthält, was dem Wert 256 entspräche.</div>
<div>
<br /></div>
<div>
Der Tag 13 an Adresse 0x3ba hat wahrscheinlich im zweiten Byte nur einen Bit-Fehler und sollte statt 0x17 0x41 die Folge 0x17 0x01 enthalten. Das ergebe dann den Wert 279.</div>
<div>
<br /></div>
<div>
Tragen wir die Tag-Bezeichner und die vorläufig korrigierten Tags des IFD ein:</div>
<div>
<div>
<ul>
<li><span style="font-family: Courier New, Courier, monospace;">1. 0x32a: 0xfe 0x00 -> 254 -> TIFFTAG_SUBFILETYPE</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">2. 0x336: 0x00 0x01 -> 256 -> TIFFTAG_IMAGEWIDTH</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">3. 0x342: 0x01 0x01 -> 257 -> TIFFTAG_IMAGELENGTH</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">4. 0x34e: 0x02 0x01 -> 258 -> TIFFTAG_BITSPERSAMPLE</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">5. 0x35a: 0x03 0x01 -> 259 -> TIFFTAG_COMPRESSION</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">6. 0x366: 0x06 0x01 -> 262 -> TIFFTAG_PHOTOMETRIC</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">7. 0x372: 0x0d 0x01 -> 269 -> TIFFTAG_DOCUMENTNAME</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">8. 0x37e: 0x06 0x01 -> 262 -> TIFFTAG_PHOTOMETRIC</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">9. 0x38a: 0x13 0x01 -> 275 -> (nicht existent)</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">10.0x396: 0x12 0x01 -> 274 -> TIFFTAG_ORIENTATION</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">11.0x3a2: 0x15 0x01 -> 277 -> TIFFTAG_SAMPLESPERPIXEL</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">12.0x3ae: 0x16 0x01 -> 278 -> TIFFTAG_ROWSPERSTRIP</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">13.0x3ba: 0x17 0x01 -> 279 -> TIFFTAG_STRIPBYTECOUNTS</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">14.0x3c6: 0x1a 0x01 -> 282 -> TIFFTAG_XRESOLUTION</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">15.0x3d2: 0x1b 0x01 -> 283 -> TIFFTAG_YRESOLUTION</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">16.0x3de: 0x1c 0x01 -> 284 -> TIFFTAG_PLANARCONFIG</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">17.0x3ea: 0x28 0x01 -> 296 -> TIFFTAG_RESOLUTIONUNIT</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">18.0x3f6: 0x52 0x01 -> 338 -> TIFFTAG_EXTRASAMPLES</span></li>
</ul>
</div>
</div>
<div>
Bis auf Eintrag 9 und eventuell Eintrag 18 klingen die Tags so sinnvoll, daß sie richtig sein könnten. Tag 9 muß dann zwischen 262 und 274 liegen und könnte ff. Tags enthalten:</div>
<div>
<ul>
<li>TIFFTAG_THRESHHOLDING 263 </li>
<li>TIFFTAG_CELLWIDTH 264</li>
<li>TIFFTAG_CELLLENGTH 265</li>
<li>TIFFTAG_FILLORDER 266</li>
<li>TIFFTAG_DOCUMENTNAME 269</li>
<li>TIFFTAG_IMAGEDESCRIPTION 270</li>
<li>TIFFTAG_MAKE 271</li>
<li>TIFFTAG_MODEL 272</li>
<li>TIFFTAG_STRIPOFFSETS 273</li>
</ul>
Wenn wir <i>tiffinfo</i> (Teil der <i>libtiff</i>) zur Hilfe nehmen, bekommen wir ff. Ausgabe:</div>
<div>
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">$> tiffinfo fuzzy-0.001.tiff <br />TIFFReadDirectoryCheckOrder: Warning, Invalid TIFF directory; tags are not sorted in ascending order.<br />TIFFReadDirectory: Warning, Unknown field with tag 275 (0x113) encountered.<br />TIFFReadDirectory: Warning, Unknown field with tag 16663 (0x4117) encountered.<br />MissingRequired: TIFF directory is missing required "StripOffsets" field.</span><br />
<br />
Also ist Eintrag 9 mit hoher Wahrscheinlichkeit das Tag TIFFTAG_STRIPOFFSETS mit ID 273.<br />
<br />
<b>Ende Teil1</b></div>
<div>
<br /></div>
<div>
<br /></div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-69843247370318351912013-08-11T12:00:00.001+02:002013-08-11T15:42:48.305+02:00Helferlein Postkorrektur von 'Und'Mithilfe eines Scriptes, welches eigentlich Worttrennungen aufsammeln sollte habe ich festgestellt, daß in den schon korrigierten Texten ab und an das Wort '<i>und</i>' mitten im Satz <u>groß</u> geschrieben war, zB.: '<i>Der Müller Und sein Sohn…</i>'.<br />
<br />
Eigentlich sollte ja, wie in meinem Beitrag "<a href="http://art1pirat.blogspot.de/2012/12/erkennung-von-ocr-und-tippfehlern-in.html">Erkennung von OCR- und Tippfehlern in Textdateien</a>" beschrieben, die Verwendung von <a href="http://www.pgdp.net/c/faq/DPCustomMono2.ttf">DPCustomMono2</a> solche Fehler bei der Korrektur sichtbar machen. Hat leider in diesem Beispiel nicht gut nicht funktioniert…<br />
<br />
Da die korrigierten Texte aber Basis für ein Wörterbuch für Tesseract sind, kam es durch die gehäufte Verwendung von '<i>Und</i>' zu einer sich selbstverstärkenden Schleife, die in neuen OCR-Texten immer öfter das '<i>Und</i>' mit Großbuchstaben mitten in den Satz einbaut.<br />
<br />
Dank Linux ist das Problem schnell behoben, ich habe jetzt ein Script, in welchen ich solche Kandidaten eintrage <span style="font-size: x-small;">(Update: Script nun vereinfacht)</span>:<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: "Courier New",Courier,monospace;">#!/bin/bash<br />if [ ! -e "$1" ]; then<br /> echo "needs a file on commandline"<br /> exit 1<br />fi<br />grep "[a-z]\+ Und" $1 && echo "#### found 'Und' (und) in $1"<br />grep "[a-z]\+U[a-z]\+" $1 && echo "#### found 'xxUxx' in $1"<br />grep "[a-z]\+ dein" $1 && echo "#### found 'dein' (dem) in $1"<br />grep "[a-z]\+ init" $1 && echo "#### found 'init' (mit) in $1"</span></blockquote>
<br />Der Ausdruck '<span style="font-family: "Courier New",Courier,monospace;">[a-z]\+ Und</span>' im Grep heißt nichts anderes als '<i>Finde alle Stellen mit einem "<u>Und</u>", vor welchem ein Leerzeichen und davor mindestens ein Kleinbuchstabe steht.</i>'<br />
<br />
In einer Schleife lasse ich dies über die OCR-Texte laufen:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">$> for i in ../txt/img*.txt; do bash find_typical_errors.sh $i; done| less</span><br />
<br />
Voila! :)Unknownnoreply@blogger.comtag:blogger.com,1999:blog-2492599027668439761.post-74190178148460767892013-07-31T19:45:00.000+02:002015-08-13T16:58:40.089+02:00baseline TIFF<style type="text/css">
span.aqua-background { background: aqua; }
span.black-background { background: black; }
span.blue-background { background: blue; }
span.fuchsia-background { background: fuchsia; }
span.gray-background { background: gray; }
span.green-background { background: green; }
span.lime-background { background: lime; }
span.maroon-background { background: maroon; }
span.navy-background { background: navy; }
span.olive-background { background: olive; }
span.purple-background { background: purple; }
span.red-background { background: red; }
span.silver-background { background: silver; }
span.teal-background { background: teal; }
span.white-background { background: white; }
span.yellow-background { background: yellow; }
</style>
Da gerade im Umfeld von OCR Projekten oft TIFF eingesetzt wird, kaum aber einer weiß, was die Besonderheiten des Bildformates sind, habe ich mich entschlossen in diesem Post die Grundlagen kurz vorzustellen.<br />
<div>
<br /></div>
<div>
Es hat sich für mich bewährt, Protokolle oder Dateiformate von Hand auseinanderzunehmen. So habe ich ein baseline TIFF erzeugt, welches im folgenden als Beispiel dienen soll. Die Datei ist 20x10 Pixel groß, s/w und gut geeignet die Besonderheiten kennenzulernen.</div>
<div>
<br /></div>
<div>
<br />
<div>
<br /></div>
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 1em; margin-right: 1em; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-LZnRr0VRPxU/Ufj8Fpx4LfI/AAAAAAAAAdE/UdbVQrrUppg/s1600/example_tiff.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://4.bp.blogspot.com/-LZnRr0VRPxU/Ufj8Fpx4LfI/AAAAAAAAAdE/UdbVQrrUppg/s640/example_tiff.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Beispiel-TIFF (hier als PNG)</td></tr>
</tbody></table>
<h2>
Kurzinfo zu 'Tagged Image File Format' (TIFF)</h2>
<h3>
Magic Byte</h3>
"II" (little-endian): <i>0x49492a00</i><br />
"MM" (big-endian): <i>0x4d4d002a</i><br />
<h3>
Dateiendung</h3>
<i>.TIF</i> bzw. <i>.TIFF</i><br />
<h3>
MimeType</h3>
<span style="font-family: Courier New, Courier, monospace;">image/tiff</span><br />
<h3>
Spezifikation</h3>
<a href="ftp://ftp.adobe.com/pub/adobe/devrelations/devtechnotes/pdffiles/tiff6.pdf">ftp://ftp.adobe.com/pub/adobe/devrelations/devtechnotes/pdffiles/tiff6.pdf</a>
bzw. <a href="http://partners.adobe.com/public/developer/tiff/index.html">http://partners.adobe.com/public/developer/tiff/index.html</a><br />
<br />
<h3>
Geschichte</h3>
Ursprünglich entwickelt von <a href="http://de.wikipedia.org/wiki/Aldus_Corporation">Aldus</a> und Microsoft. 1994 wurde Aldus von Adobe übernommen.<br />
<br />
Die aktuelle Version von TIFF ist 6.0 (1992) und wird moderat durch <a href="http://www.remotesensing.org/libtiff/internals.html">TIFF Technical Notes</a>, zB. zu 'deflate'-Kompression ergänzt. <br />
<br />
<br />
<h2>
Aufbau</h2>
Eine TIFF-Datei ist im Wesentlich wie folgt aufgebaut:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-Qr-40FdkGAw/UfkFx5J384I/AAAAAAAAAd4/gpKaL2GINrE/s1600/tiff_vortrag__1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="640" src="http://4.bp.blogspot.com/-Qr-40FdkGAw/UfkFx5J384I/AAAAAAAAAd4/gpKaL2GINrE/s640/tiff_vortrag__1.png" width="436" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Aufbau TIFF Datei</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Sie besteht aus Header, Image File Directories und Streams.<br />
<br />
Ich beziehe mich auf oben gezeigte mini TIFF-Datei (Ist mittlerweile unter <a href="https://github.com/SLUB-digitalpreservation/fixit_tiff/tree/master/examples">https://github.com/SLUB-digitalpreservation/fixit_tiff/tree/master/examples</a> zu finden) . Im folgenden ist die Datei als Hex-Dump zu sehen:<br />
<br />
<div class="tableblock ">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 1. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="red-background">4949 2a00 2600 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0000 0000 0000 fd1e</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="red-background">II*.&...</span>........</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000010</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>f011 1080 111c e011</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>1080 1110 8011 1080</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000020</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0000 0000 0000 <span class="yellow-background">1000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">fe00 0400 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>......<span class="yellow-background">..........</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000030</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0000 0000 0001 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000 1400 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">................</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000040</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0101 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0a00 0000 0201 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">................</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000050</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0301 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">................</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000060</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000 0601 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000 0000 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">................</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000070</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0d01 0200 2500 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">ec00 0000 1101 0400</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">....%...........</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000080</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000 0800 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1201 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">................</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000090</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000 1501 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">................</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000a0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1601 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">4000 0000 1701 0400</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">........@.......</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000b0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000 1e00 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1a01 0500 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">................</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000c0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1201 0000 1b01 0500</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000 1a01 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">................</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000d0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1c01 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000 2801 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">............(...</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000e0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000 0200 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0000 0000</span> 2f68 6f6d</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">............</span>/hom</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000f0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>652f 726f 6d65 796b</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>652f 7469 6666 2f65</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>e/romeyke/tiff/e</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000100</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>7861 6d70 6c65 5f74</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>6966 662e 7469 6666</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>xample_tiff.tiff</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000110</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0000 0000 0048 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0001 0000 0048 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>.....H.......H..</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000120</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0001</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>..</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<br />
<h3>
Header</h3>
<div>
Der Header einer TIFF-Datei ist</div>
<div class="sectionbody" style="max-width: 45em;">
<ul class=" incremental">
<li>8 Byte groß
</li>
<li>
enthält Magic Bytes
</li>
<li>
und Offset des ersten IFD
</li>
</ul>
Die ersten zwei Bytes (0x00-0x01) beschreiben die byte-order: </div>
<div class="sectionbody" style="max-width: 45em;">
<ul>
<li><i>0x4949</i> little endian (least significant to most significant byte) </li>
<li><i>0x4d4d</i> big endian (most significant to least significant byte)</li>
</ul>
<div>
Die byte-order ist wichtig und zieht sich durch die gesamte TIFF-Datei. </div>
Die nächsten zwei Bytes enthalten die Antwort auf den Sinn des Lebens und entsprechen der Zahl 42 (ebenfalls abhängig von der byte order).</div>
<div class="sectionbody" style="max-width: 45em;">
<br /></div>
<div class="sectionbody" style="max-width: 45em;">
Die Bytes 4-7 zeigen auf das erste Image File Directory (IFD), hier die Adresse
<i>0x0000 0026</i>. Baseline TIFFs enthalten nur ein IFD, mehr dazu später.</div>
<div class="sectionbody" style="max-width: 45em;">
<br /></div>
<div class="sectionbody" style="max-width: 45em;">
<h3>
Image File Directory</h3>
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="sectionbody" style="max-width: 45em;">
<div class="paragraph incremental">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-9waEH_BhU3Y/UfkFx7T_ZgI/AAAAAAAAAeE/mjFp_ibBt-8/s1600/tiff_vortrag__2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="489" src="http://4.bp.blogspot.com/-9waEH_BhU3Y/UfkFx7T_ZgI/AAAAAAAAAeE/mjFp_ibBt-8/s640/tiff_vortrag__2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Aufbau Image File Directory (IFD) in TIFF-Datei</td></tr>
</tbody></table>
Im Kopf des IFDs wird in ersten 2 Bytes wird die Anzahl der Tags festgelegt. Da so eine sehr variable Länge des IFDs entsteht muss am Ende der Speicherort des nächsten IFDs angegeben sein.<br />
<br />
Das letzte IFD enthält als Offset den Wert <i>0x0000 0000 0000 0000</i>. <br />
<br />
Wenn wir den Hex-Dump einfärben, so daß die Tags abwechselnd gelb oder silber hinterlegt sind, wird die Struktur deutlicher:<br />
<br />
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 2. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>4949 2a00 2600 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0000 0000 0000 fd1e</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>II*.&...........</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000010</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>f011 1080 111c e011</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>1080 1110 8011 1080</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000020</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0000 0000 0000 <span class="olive-background">1000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">fe00 0400 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000030</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0000 0000</span> <span class="silver-background">0001 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 1400 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000040</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0101 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0a00 0000</span> <span class="silver-background">0201 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000050</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0301 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000060</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000</span> <span class="silver-background">0601 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 0000 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000070</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0d01 0200 2500 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">ec00 0000</span> <span class="silver-background">1101 0400</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>....%...........</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000080</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 0800 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1201 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000090</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000</span> <span class="silver-background">1501 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000a0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1601 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">4000 0000</span> <span class="silver-background">1701 0400</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>........@.......</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000b0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 1e00 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1a01 0500 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000c0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1201 0000</span> <span class="silver-background">1b01 0500</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 1a01 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000d0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1c01 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000</span> <span class="silver-background">2801 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>............(...</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000e0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 0200 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="green-background">0000 0000</span> 2f68 6f6d</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>............/hom</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000f0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>652f 726f 6d65 796b</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>652f 7469 6666 2f65</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>e/romeyke/tiff/e</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000100</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>7861 6d70 6c65 5f74</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>6966 662e 7469 6666</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>xample_tiff.tiff</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000110</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0000 0000 0048 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0001 0000 0048 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>.....H.......H..</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000120</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0001</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>..</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<br />
Im Beispiel enthält die Adresse <i>0x00000026</i> den Wert <i>1000</i>, sprich: das IFD
enthält 16 Einträge. Da jeder Eintrag 12 Bytes enhält geht das IFD bis zur
Adresse <i>0x00000026</i> + 2 + 16*12 + 4 = 38 + 2 + 192 + 4 = 236 = <i>0x0000 00ec</i>.<br />
<br />
<h3>
IFD - Entries (Tags)</h3>
<br />
Ein IFD-Tageintrag beschreibt verschiedene Attribute eines Bildes oder der Kompressionsmethode. Es gibt viele verschiedene Tags die nicht alle verwendet werden müssen. Durch diese IFD-Einträge, kurz Tags, hat TIFF seinen Namen.<br />
<br />
Die Tag-Einträge in der IFD sind alle 12 Bytes groß und wie folgt aufgebaut:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-wKhvsq4CFHE/UfkFxyy9owI/AAAAAAAAAeA/-vBNn1NsZuM/s1600/tiff_vortrag__3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="108" src="http://4.bp.blogspot.com/-wKhvsq4CFHE/UfkFxyy9owI/AAAAAAAAAeA/-vBNn1NsZuM/s640/tiff_vortrag__3.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">IFD Eintrag bzw Tag eines TIFFs</td></tr>
</tbody></table>
Innerhalb eines Image File Directories müssen die IFD-Tags nach ihrer '<i>Tag ID</i>' aufsteigend sortiert vorliegen.<br />
Dabei gelten die Bereiche <i>0x8000</i>-<i>0xfde7</i> als "private" und <i>0xfde8</i>-<i>0xffff</i> als "reusable". Für spezielle Anwendungen kann man von Adobe die Vergabe eine "private" Tag-ID anfordern. "reusable" Tags können frei verwendet werden.<br />
<br />
Allerdings können zukünftige Versionen von TIFF die beiden Bereiche neu definieren.<br />
<br />
'<i>Field Type</i>' beschreibt den Datentyp der Werte. Zur Zeit sind ff. definiert:<br />
<ul class=" incremental">
<li>1 = BYTE (8-bit unsigned integer)
</li>
<li>
2 = ASCII (7-bit ASCII code, null-terminiert).
</li>
<li>
3 = SHORT (16-bit unsigned integer)
</li>
<li>
4 = LONG (32-bit unsigned integer)
</li>
<li>
5 = RATIONAL (Zähler und Nenner, je ein LONG)
</li>
<li>
6 = SBYTE (8-bit signed integer, 2-er Kompl.)
</li>
<li>
7 = UNDEFINED (8-bit, feldabhängig)
</li>
<li>
8 = SSHORT (16-bit signed integer, 2-er Kompl.)
</li>
<li>
9 = SLONG (32-bit signed integer, 2-er Kompl.)
</li>
<li>
10 = SRATIONAL (Zähler und Nenner, je ein SLONG)
</li>
<li>
11 = FLOAT (32-bit, single precision IEEE)
</li>
<li>
12 = DOUBLE (64-bit, double precision IEEE)</li>
</ul>
'<i>Count'</i> gibt an, wieviele Werte (nicht Bytes!) vom Typ '<i>Field Type'</i> gespeichert werden. </div>
<div class="paragraph incremental">
<br /></div>
<div class="paragraph incremental">
Wenn Werte eines IFD-Eintrages zusammen (<i>Count</i> mal <i>FieldType</i>) 4 Bytes nicht übersteigen, werden diese direkt im
<i>Value/Offset</i>-Bereich gespeichert. Andernfalls gibt <i>Value/Offset</i> die Adresse innerhalb der TIFF-Datei an.<br />
<br />
Gehen wir nun mal die einzelnen IFD-Einträge, die im Beispiel verwendet werden, durch.<br />
<h3>
IFD Entry - 0x28 </h3>
Der erste IFD-Eintrag an Adresse <i>0x28</i> sieht wie folgt aus:<br />
<br />
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 3. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000020</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0000 0000 0000 1000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">fe00 0400 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000030</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0000 0000</span> 0001 0300</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 1400 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<br />
Die <i>Tag-ID</i> lautet <i>0x00fe</i> und bedeutet TIFFTAG_SUBFILETYPE (<span style="font-size: x-small;">Die jeweils aktuellen Werte, kann man sich aus der Header-Datei der libtiff heraussuchen, meist in /usr/include/tiff/tiff.h</span>). Der <i>Field Type</i> lautet <i>0x0004</i> und bedeutet 32-Bit unsigned integer. <i>Count</i> steht auf <i>0x0000 0001</i>. Da ein 32-Bit unsigned integer in 4 Bytes passt, handelt es sich um den <i>Value</i> <i>0x0000 0000</i>.</div>
<div class="paragraph incremental">
<br /></div>
<div class="paragraph incremental">
<h3>
IFD Entry - 0x34</h3>
Der IFD-Eintrag an Adresse <i>0x34</i> sieht wie folgt aus:<br />
<br />
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 4. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000030</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0000 0000 <span class="silver-background">0001 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 1400 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<br />
ergibt <i>Tag-ID</i> <i>0x0100</i>, der für <i>TIFFTAG_IMAGEWIDTH</i> steht. <i>Field
Type</i> ist <i>0x0003</i>, also short 16-Bit unsigned integer. Count ist <i>0x0000 0001</i>.
Der Wert lautet damit <i>0x0014</i>, welches 20 Pixel entspricht.<br />
<h3>
IFD Entry - 0x40</h3>
Der IFD-Eintrag an Adresse <i>0x40</i> sieht wie folgt aus:
<br />
<br />
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 5. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000040</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0101 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0a00 0000</span> 0201 0300</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<br />
steht für <i>Tag-ID</i> <i>0x0101</i> = <i>TIFFTAG_IMAGELENGTH</i>. <i>Field Type</i> ist
ebenfalls <i>0x0003</i> und <i>Count</i> ebenso 1. Der Wert beträgt demnach <i>0x000a</i>,
also 10 Pixel.
<br />
<h3>
IFD Entry - 0x4c</h3>
Der IFD-Eintrag an Adresse <i>0x4c</i> sieht wie folgt aus:<br />
<br />
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 6. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000040</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0101 0300 0100 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0a00 0000 <span class="silver-background">0201 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000050</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0301 0300 0100 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<br />
steht für Tag-ID <i>0x0102</i> = <i>BITS_PER_SAMPLE</i>, Field Type ist <i>0x0003</i>, Count
ist 1. Der Wert ist dann <i>0x00000001</i>, also 1.<br />
<div>
<h3>
IFD Entry - 0x58</h3>
Der IFD-Eintrag an Adresse <i>0x58</i> sieht wie folgt aus:
<br />
<br />
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 7. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000050</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 0100 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0301 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000060</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000</span> 0601 0300</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 0000 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<br />
steht für <i>Tag-ID</i> <i>0x0103</i> = <i>TIFFTAG_COMPRESSION</i>, <i>Field-Type</i> und <i>Count</i> wie oben. Der Wert lautet <i>0x0000 0001</i> und bedeutet <i>No Compression</i>.
</div>
<div>
<br />
<h3>
IFD Entry - 0x64</h3>
Der IFD-Eintrag an Adresse 0x64 sieht wie folgt aus:<br />
<br /></div>
<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="IFD-Entries - 0x64";slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 8. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000060</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 <span class="silver-background">0601 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 0000 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
steht für Tag-ID <i>0x0106</i> = <i>TIFFTAG_PHOTOMETRIC</i>. Der Field Type lautet
<i>0x0003</i>, also 16-Bit short unsigned integer. Count ist <i>0x0000 0001</i>, also 1
und der Wert ist <i>0x0000 0000</i>, also 'PHOTOMETRIC_MINISWHITE", sprich das nicht
gesetzte Bit entspricht der Farbe Weiß.</div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<h3>
IFD-Entry - 0x70</h3>
<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="IFD-Entries - 0x70";slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 9. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000070</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0d01 0200 2500 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">ec00 0000</span> 1101 0400</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>....%...........</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
steht für Tag-ID <i>0x010d</i> = <i>TIFFTAG_DOCUMENTNAME</i>. Field Type lautet <i>0x0002</i>,
also 7-Bit ASCII Code in 8 Bit. Count ist <i>0x0000 0025</i>, dh. inklusive
Null-Byte ist der String 37 Zeichen lang. Da dies nicht in 4 Bytes passt,
handelt es sich bei <i>0x000000ec</i> nicht um einen Wert, sondern um eine Adresse
im File.<br />
<br /></div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<script type="text/javascript">/*<![CDATA[*/subslide +=1;document.write("<h1 class='"+nextclass+"'>
"+nexttitle+" ("+ subslide+")</h1>
");slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock ">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 10. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000070</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0d01 0200 2500 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">ec00 0000</span> 1101 0400</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>....%...........</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000e0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 0200 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0000 0000 <span class="fuchsia-background">2f68 6f6d</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>............<span class="fuchsia-background">/hom</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000f0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">652f 726f 6d65 796b</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">652f 7469 6666 2f65</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">e/romeyke/tiff/e</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000100</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">7861 6d70 6c65 5f74</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">6966 662e 7469 6666</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">xample_tiff.tiff</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000110</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">00</span>00 0000 0048 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0001 0000 0048 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">.</span>....H.......H..</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000120</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0001</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>..</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
Der Wert lautet also <i>/home/romeyke/tiff/example_tiff.tiff</i>.</div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<h3>
IFD-Entry - 0x7c</h3>
<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="IFD-Entries - 0x7c";slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 11. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000070</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0d01 0200 2500 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>ec00 0000 <span class="silver-background">1101 0400</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>....%...........</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000080</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 0800 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>1201 0300 0100 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
steht für Tag-ID <i>0x0111</i> = <i>TIFFTAG_STRIPOFFSETS</i>. Field Type lautet <i>0x0004</i>,
also 32 Bit unsigned integer. Count ist <i>0x0000 0001</i>, und der Wert =
<i>0x00000008</i>, dh. die Bilddaten liegen auf Adresse 0x08:<br />
<br /></div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<script type="text/javascript">/*<![CDATA[*/subslide +=1;document.write("<h1 class='"+nextclass+"'>
"+nexttitle+" ("+ subslide+")</h1>
");slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 12. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>4949 2a00 2600 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">0000 0000 0000 fd1e</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>II*.&...<span class="fuchsia-background">........</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000010</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">f011 1080 111c e011</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">1080 1110 8011 1080</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">................</span></tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000020</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">0000 0000 0000</span> <span class="olive-background">1000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">fe00 0400 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">......</span>..........</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000070</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0d01 0200 2500 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>ec00 0000 <span class="silver-background">1101 0400</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>....%...........</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000080</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 0800 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>1201 0300 0100 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<h3>
IFD-Entry - 0x88</h3>
<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="IFD-Entries - 0x88";slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 13. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000080</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 0800 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1201 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000090</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000</span> 1501 0300</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 0100 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
steht für Tag-ID <i>0x0112</i> = <i>TIFFTAG_ORIENTATION</i>, Field Type lautet <i>0x0003</i> =
16 Bit unsigned integer. Count beträgt <i>0x0000 0001</i> und der Wert <i>0x0000
0001</i>, was "row 0 top, col 0 lhs", also von Oben Links beginnend bedeutet.</div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<h3>
IFD-Entry - 0x94</h3>
<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="IFD-Entries - 0x94";slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 14. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000090</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 <span class="silver-background">1501 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
steht für Tag-ID <i>0x0115</i> = <i>TIFFTAG_SAMPLESPERPIXEL</i>, Field Type lautet
<i>0x0003</i> = 16 Bit unsigned integer. Count beträgt <i>0x0000 0001</i> und Wert
<i>0x0000 0001</i>, also 1.</div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<h3>
IFD-Entry - 0xa0</h3>
<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="IFD-Entries - 0xa0";slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 15. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000a0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1601 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">4000 0000</span> 1701 0400</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>........@.......</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
steht für Tag-ID <i>0x0116</i> = <i>TIFFTAG_ROWSPERSTRIP</i>, Field Type <i>0x0003</i> = 16 Bit
unsigned integer. Count beträgt <i>0x0000 0001</i> und Wert <i>0x0000 0004</i>, also 4
Reihen pro Streifen.</div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<h3>
IFD-Entry - 0xac</h3>
<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="IFD-Entries - 0xac";slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 16. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000a0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>1601 0300 0100 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>4000 0000 <span class="silver-background">1701 0400</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>........@.......</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000b0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 1e00 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>1a01 0500 0100 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
steht für Tag-ID <i>0x0117</i> = <i>TIFFTAG_STRIPBYTECOUNTS</i>, Field Type <i>0x0004</i> = 32 Bit
unsigned integer. Count beträgt <i>0x0000 0001</i> und Wert <i>0x0000 001e</i> = 30, dh.
30 Bytes pro Streifen.</div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<h3>
IFD-Entry - 0xb8</h3>
<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="IFD-Entries - 0xb8";slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 17. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000b0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 1e00 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1a01 0500 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000c0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1201 0000</span> 1b01 0500</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 1a01 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
steht für Tag-ID <i>0x011a</i> = <i>TIFFTAG_XRESOLUTION</i>, Field Type <i>0x0005</i> =
RATIONAL (2x 32 Bit unsigned integer), Count beträgt <i>0x0000 0001</i>. Da Wert
nicht in 4 Byte passt, handelt es sich um Adresse im File, dh. <i>0x0000 0112</i>:<br />
<br /></div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<script type="text/javascript">/*<![CDATA[*/subslide +=1;document.write("<h1 class='"+nextclass+"'>
"+nexttitle+" ("+ subslide+")</h1>
");slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 18. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000b0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 1e00 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1a01 0500 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000c0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1201 0000</span> 1b01 0500</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 1a01 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>00000110</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0000 <span class="fuchsia-background">0000 0048 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="fuchsia-background">0001</span> 0000 0048 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>..<span class="fuchsia-background">...H....</span>...H..</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
Der Zähler beträgt <i>0x4800 0000</i> = 1207959552 und der
Nenner <i>0x0100 0000</i> = 16777216. Damit beträgt die X-Auflösung 1207959552/16777216 = 72 dots pro Einheit</div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<h3>
IFD-Entry - 0xc4</h3>
<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="IFD-Entries - 0xc4";slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 19. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000c0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>1201 0000 <span class="silver-background">1b01 0500</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 1a01 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
steht für Tag-ID <i>0x011b</i> = <i>TIFFTAG_YRESOLUTION</i>, Field Type <i>0x0005</i> =
RATIONAL (2x 32 Bit unsigned integer), Count beträgt <i>0x0000 0001</i>. Da Wert
nicht in 4 Byte passt, handelt es sich um Adresse im File, dh. <i>0x0000 011a</i>:<br />
<br /></div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<script type="text/javascript">/*<![CDATA[*/subslide +=1;document.write("<h1 class='"+nextclass+"'>
"+nexttitle+" ("+ subslide+")</h1>
");slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 20. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000c0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>1201 0000 <span class="silver-background">1b01 0500</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 1a01 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>................</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>:</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>00000110</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>0000 0000 0048 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0001 <span class="fuchsia-background">0000 0048 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>.....H....<span class="fuchsia-background">...H..</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>00000120</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
Der Zähler beträgt <i>0x4800 0000</i> = 1207959552 und der
Nenner <i>0x0100 0000</i> = 16777216. Damit beträgt die Y-Auflösung 1207959552/16777216 = 72 dots pro Einheit.</div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<h3>
IFD-Entry - 0xd0</h3>
<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="IFD-Entries - 0xd0";slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 21. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000d0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">1c01 0300 0100 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="yellow-background">0100 0000</span> 2801 0300</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>............(...</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
steht für Tag-ID <i>0x011c</i> = <i>TIFFTAG_PLANARCONFIG</i>, Field Type <i>0x0003</i> für 16
Bit unsigned integer, Count <i>0x0000 0001</i> und Wert <i>0x0001</i>, was "single image
plane" bedeutet.</div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
<div class="sect1">
<h3>
IFD-Entry - 0xdc</h3>
<script type="text/javascript">/*<![CDATA[*/subslide=1;nextclass="sect1";nexttitle="IFD-Entries - 0xdc";slidefootnotes="";/*]]>*/</script>
<br />
<div class="sectionbody" style="max-width: 45em;">
<div class="tableblock">
<table cellpadding="4" cellspacing="0" frame="border" rules="all" style="width: 100%px;">
<caption class="title">Tabelle 22. Beispiel:</caption>
<colgroup><col width="7%"></col>
<col width="30%"></col>
<col width="30%"></col>
<col width="30%"></col>
</colgroup><thead>
<tr>
<th align="center" valign="top">Byte </th>
<th align="left" valign="top">Hex (8 Byte) </th>
<th align="left" valign="top">(8 Byte) </th>
<th align="left" valign="top">ASCII</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000d0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>1c01 0300 0100 0000</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0100 0000 <span class="silver-background">2801 0300</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>............(...</tt></div>
</td>
</tr>
<tr>
<td align="center" valign="top"><div class="table">
<tt>000000e0</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt><span class="silver-background">0100 0000 0200 0000</span></tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>0000 0000 2f68 6f6d</tt></div>
</td>
<td align="left" valign="top"><div class="table">
<tt>............/hom</tt></div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="paragraph incremental">
<br />
steht für Tag-ID <i>0x0128</i> = <i>TIFFTAG_RESOLUTIONUNIT</i>, Field Type <i>0x0003</i> für 16
Bit unsigned integer, Count <i>0x0000 0001</i> und Wert <i>0x0000 0002</i>, was für <i>INCH</i>
steht. Die unter <i>TIFFTAG_XRESOLUTION</i> und <i>TIFFTAG_YRESOLUTION</i> gemachten
Angaben beziehen sich also auf inch.<br />
<h2>
Fazit</h2>
TIFF ist eigentlich relativ simple. Durch das Image File Directory (IFD) werden die Tags verwaltet, die die Datei beschreiben. Der Hauptunterschied zwischen baseline TIFFs und erweiterten ist, daß letztere mehrere Image File Directories enthalten können.<br />
<br />
Die Informationen aus dem TIFF kann man schneller mit dem der libtiff beiliegenden Werkzeug <i>tiffinfo</i> herausholen:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">$ tiffinfo example_tiff.tiff </span><br />
<span style="font-family: Courier New, Courier, monospace;"> TIFF Directory at offset 0x26 (38)</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Subfile Type: (0 = 0x0)</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Image Width: 20 Image Length: 10</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Resolution: 72, 72 pixels/inch</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Bits/Sample: 1</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Compression Scheme: None</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Photometric Interpretation: min-is-white</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Orientation: row 0 top, col 0 lhs</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Samples/Pixel: 1</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Rows/Strip: 64</span><br />
<span style="font-family: Courier New, Courier, monospace;"> Planar Configuration: single image plane</span><br />
<span style="font-family: Courier New, Courier, monospace;"> DocumentName: /home/romeyke/tiff/example_tiff.tiff</span><br />
<br />
Im Beispiel wurden nur Stripes verwendet, TIFF unterstützt aber auch Kacheln. Für tiefergehende Beschäftigung mit TIFF sei nochmal auf die sehr gute Dokumentation unter <a href="ftp://ftp.adobe.com/pub/adobe/devrelations/devtechnotes/pdffiles/tiff6.pdf">ftp://ftp.adobe.com/pub/adobe/devrelations/devtechnotes/pdffiles/tiff6.pdf</a> verwiesen.<br />
<br />
Die einzelnen Tags, die in baseline TIFF erlaubt sind, sind unter <a href="http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html">http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html</a> aufgelistet.</div>
</div>
</div>
<script type="text/javascript">/*<![CDATA[*/if (slidefootnotes != ''){document.write("<hr/><p>
"+slidefootnotes+"</p>
");}/*]]>*/</script>
</div>
<div class="slide">
</div>
Unknownnoreply@blogger.com