Digitalisieren in vier Graustufen auf dem Monochromschirm

Die Idee zu diesem Programm entstand, als ich etwas enttäuscht die Qualität der digitalisierten Bilder des Easytizers im Monochrombetrieb sah. In diesem Modus gab es nur schwarze oder weihe Flächen und bestenfalls ein sehr grobes Raster; arbeitete man in der mittleren Auflösung und ließ es in ein hochauflösendes Bild umrechnen (für Ausdrucke unumgänglich), war das Ergebnis auch nicht berauschend. Da der Digitizer in vier Graustufen bis zu einer Auflösung von ca. 760500 arbeitet, entstand bald die Idee, das für den Monochrommonitor zu nutzen. Intern legt das Programm ein Bild mit der Auflösung 640400 und zwei Planes ab. Dieses Bild ist übrigens Speicher- (64 kByte) und ladbar. Ilm gleich eine ungefähre Vorstellung zu haben, was nun eigentlich im Speicher ist, wird ein zweites Bild digitalisiert (s/w) und sofort angezeigt. Dies geschieht immer, egal ob einmal oder fortlaufend digitalisiert wird. Über einen Menüpunkt aus dem Menü "Rechnen" wird nun das vierfarbige Bild in ein monochromes umgerechnet.

Es stehen zur Zeit drei Möglichkeiten zur Verfügung:

  1. Umrechnen in ein definiertes Muster
  2. Umrechnen über eine zufällige Verteilung
  3. wie zuvor, nur werden horizontal zufällige Aneinanderreihungen von gleichfarbigen Pixeln vermieden.

Diese Umrechnungsroutinen sind in 'C' geschrieben und dürften ausreichend schnell sein. Beim Versuch, diese Routinen in BASIC zu schreiben, dauerte eine Umrechnung fast 10 Minuten.

Im Menü Parameter verbirgt sich die Auswahl der Muster bzw. die Helligkeit für die Zufallsmuster. Bei der Musterauswahl ist zu beachten, daß jenes Muster gilt, das nach dem Invertieren mit dem ‘OK'-Zeichen versehen ist. Man hat hier die Möglichkeit, auch die Farben Schwarz und Weiß zu ändern, während das bei den Zufallsmustern nicht möglich ist.

Beim Menüpunkt Zufall können nur drei Standardeinstellungen für Hell- bzw. Dunkelgrau gewählt werden. Neben den Buttons steht eine Prozentzahl, die angibt, wie hell bzw. dunkel der Grauton ist.

Die Menüpunkte aus dem Menü Rechnen können natürlich mehrmals angewählt werden, die große Bit-Map bleibt bis zum nächsten Digitalisieren erhalten. Das letzte Menü ‘Invertieren’ dient vor allem diversen Snapshot-Programmen (Snapshot von GST, Scrcop von Application Systems), da das Programm mit invertiertem Bildschirm arbeitet und so alle auf diese Art abgespeicherten Bilder negativ wären. Nebenbei wird gleichzeitig die Menüleiste abgeschaltet, damit das gesamte Bild zur Verfügung steht. Mit der Taste T wird alles wieder normal. Über den Menüpunkt Sichern kann, wie oben erwähnt, das gesamte Bit-Map oder der Bildschirm im normalen Degas-Format (32034 Byte. Endung PI3) gespeichert werden. Geladen können nur Bit-Maps werden, die jedoch erst nach Anwahl eines Punktes aus dem Menü ‘Rechnen auf dem Bildschirm dargestellt werden.

Bild 1: Die Musterauswahl des Programms
Bild 2: Auch Zufallsmuster lassen sich einstellen.

Einige Tips für bessere Bilder

Der Easytizer ist sehr rotempfindlich, man sollte deshalb darauf achten, kein Bild mit großen grellroten Flächen als Vorlage zu nehmen (dies gilt natürlich nur, wenn man den Easytizer mit der gesamten Farbinformation füttert. Verwendet man z.B. eine Schwarzweißkamera, ist das egal). Obwohl der Digitizer sehr schnell ist, sollte man ein gutes, am besten ein digitales Standbild zur Verfügung haben. Sehr gute Ergebnisse erzielt man, wenn man mit einer Videokamera ein Foto etc. aufnimmt und sofort zum Rechner sendet. Legt man die Kamera auf einen Tisch und stellt das Bild 7-20 cm entfernt auf, erreicht man fast dasselbe wie mit einem teuren Reprostativ. Man muß nur für genug Licht sorgen; aber Vorsicht, auch zuviel Licht beeinträchtigt die Qualität. Sollte die Kamera über einen Backlight-Schalter verfügen, kann man damit den Kontrast verändern.

Spezielles über das Programm

Die Digitalisierroutinen sind aus der Zeitschrift ST-Computer, Ausgabe 9/87, entnommen. Die Umrechnungen bestehen eigentlich aus einfachen Bitverschiebe -und -kopierbefehlen. Das größte Problem war die Einbindung in das GFA-Programm. In der Anleitung des BASICs und in diversen Zeitschriften ist zwar wunderbar beschrieben, wie man C-Programme mittels des Befehls C: aufruft; wie man jedoch einen C-Compiler dazu bewegt, einen Code zu liefern, der auf diese Art und Weise aufrufbar ist, ist nirgends zu finden. Um anderen Anwendern unzählige Abstürze zu ersparen, einige Tips, wie ich das Problem löste.

Um ein C-Programm in BASIC einzubinden, muß es frei im Speicher verschiebbar sein. Aus diesem Grund dürfen keine absoluten Adressen und keine Relozierdaten vorhanden sein. Bei den Compileroptionen ist bei Turbo-C jedoch kein Punkt vorhanden, der dies gewährleistet. Man schreibt also sein Programm, darf aber das Wort main nicht verwenden.

void cdecl photobox(ZEIGER adr)
{
    switch (adr->was)
    {
    case 1: muster(); break; 
    case 2: zufall_1(); break; 
    case 3: zufall_2(); break;
    }
}

Das Programm sieht also aus wie ein Unterprogramm. Für die Datenübergabe verwendet man am besten Strukturen und übergibt nur die Adresse der Struktur.

typedef struct {
    unsigned int was; 
    unsigned int *adresse;
    unsigned int h1;
    unsigned int *schirm;
    unsigned int zufallszahl;
}*ZEIGER:

Strukturen sollte man übrigens viel öfter benutzen, sie sind eine tolle Sache. Mit Variablen sollte man sehr sparsam umgehen und sie möglichst als register definieren. Danach compiliert man das Ganze mit den Standardeinstellungen. Für das Linken muß man sich eine spezielle Projektdatei erstellen. Man nimmt die STANDARD.PRJ und löscht die Zeile mit TCSTART.O. Dadurch wird verhindert, daß der Linker den Programmkopf und die Reloziertabelle dazuhängt. Das entstandene verstümmelte Programm sieht man sich am besten mittels eines Disassembler an, ob ja keine absoluten Adressen vorhanden sind. Ist alles in Ordnung, kann man das Programm ins GFA-BASIC einbinden. Dies geht am einfachsten mit dem Befehl INLINE.

INLINE c_prog%,2000

Die Datenübergabe kann mittels POKEs erfolgen (wie im Programm PHOTOBOX) oder etwas eleganter über Felder.

DPOKE c_dat%+40,dunkel%
LPOKE c_dat%+42,schirm_adresse% 
DPOKE c_dat%+46,zufall_startzahl% 
~C:c_prog%(L:c dat%) 'c_dat% ist die Adresse der Struktur 
'besser und kürzer wäre das Verwenden eines Feldes

Eine andere Möglichkeit ist, das disassemblierte Programm in den GFA-Assembler zu laden. Hier läßt sich vielleicht noch etwas ändern oder optimieren (wenn man kann). Danach startet man vom Assembler aus das GFA-BASIC, lädt sein BASIC-Programm und stellt den Cursor auf den Befehl INLINE. Wenn man jetzt die HELP-Taste drückt, erscheint am oberen Bildschirmrand eine Menüzeile, die neben den bekannten Punkten den Punkt ASS enthält. Nach dessen Anwahl ist man wieder im Assembler. Nun kann man das Unterprogramm assemblieren, es wird frei verschiebbar in den INLINE-Befehl geschrieben. Diese Vorgehensweise ist auch in der Anleitung für den GFA-Assembler beschrieben; wenn man sie oft genug liest, findet man sie. Nach dem Verlassen des Assemblers ist man wieder im BASIC und kann alles sichern. Man sollte aus Sicherheitsgründen auch den INLINE abspeichern. Diese Möglichkeit des Zusammenspiels bietet natürlich nur der GFA-Assembler in Verbindung mit dem GFA-BASIC 3.0. Das GFA-BASIC-Programm ist wegen des Umfangs (ca. 1000 Zeilen) nur auf der Programmierpraxisdiskette GFA-BASIC / zu finden.

Die Umrechnungsroutinen in C


Reinhard Wiesler
Aus: ST-Computer 01 / 1990, Seite 62

Links

Copyright-Bestimmungen: siehe Über diese Seite