NEO2MONO Ein Programm zur Konvertierung von Neochrome Bildern Hier ist das von allen ATARI ST Besitzern lang erwartete Kon- vertierungsprogramm. Geh”ren Sie auch zu denen, die sich die Public Domain Disketten besorgt haben, und nun die vielen, sch”nen Neochromebilder die sich darauf finden nicht anschauen k”nnen? Seien sie unbesorgt hier ist die L”sung: Das Programm NEO2MONO konvertiert die Farbbilder so, daž sie auf dem Monochromemonitor dargestellt werden k”nnen. Die Farben werden dabei durch Grauwerte simuliert. Und das Ganze geht in Sekundenschnelle. Vergessen sie also irgendwelche seltsamen BASIC Programme, die zwar auch konvertieren k”nnen, aber so, daž man in der Zwischenzeit ruhig mal eine (oder auch zwei) Tasse Kaffee trinken kann. NEO2MONO erledigt ein Bild in 3.6 Sekunden -- ohne Laden von Diskette -- und ist damit gleichzeitig ein Beispiel dafr, daž man in C die kompliziertesten Bitfummeleien sehr effizient erledigen kann. Bevor ich das Programm kurz erkl„re einige Worte zur Bedienung: Das Programm muž die Endung TTP (Tos Takes Parameter) bekommen. Nach dem Anklicken gibt es dann zwei M”glichkeiten: 1. man gibt einfach den Namen eines Neochromebildes an. Dieses wird dann geladen und die konvertierte Version auf dem Bildschirm dargestellt. -- Treten sie einige Meter zurck und bewundern sie das Ergebnis. 2. oder sie geben vor dem Dateinamen noch -w ein. Dann verschwindet das Bild nach Beendigung des Programmes zwar wie bei 1.) vom Bildschirm, aber gleichzeitig wird eine Kopie davon auf Diskette gerettet (mit der Endung mon statt neo). Dadurch haben sie die M”glichkeit das Bild sp„ter mit irgendwelchen anderen Programmen zu laden (z.B in BASIC mit bload) und zu bearbeiten. Also um es noch einmal ganz deutlich zu machen: neo2mono aafall.neo konvertiert den berhmten Neochrome Wasserfall (leider ohne Bewegung) und neo2mono -w aafall.neo erzeugt nach der Konvertierung eine Datei aafall.mon die man dann weiterverarbeiten kann. Um zu verstehen, wie das Ganze funktioniert muž man zuerst einmal wissen, wie der ATARI seinen Bildschirm organisiert hat. Uns interessieren nur zwei der drei Aufl”sungsstufen. Die Aufl”sung von 640 * 400, die es (bisjetzt) nur schwarz- weiž gibt, weil wir das Bild auf diese Aufl”sung konvertieren mssen und 320 * 200, weil die Neochrome Bilder in dieser Aufl”sung gespeichert sind. Die hohe Aufl”sung ist sehr einfach angelegt. Jedem Bit im Bildspeicher ist genau ein Punkt (Pixel) auf dem Bildschirm zugeordnet. Ist das Bit auf eins gesetzt wird der Punkt schwarz, ist es auf Null, weiž angezeigt. Das h”chstwertige Bit im allerersten Wort (1 Wort = 16 Bit) des Bildspeichers ist fr den Punkt ganz links oben in der Ecke zust„ndig. Man kann sich nun leicht ausrechnen, daž man genau 640/16 = 40 Speicherworte fr eine Bildschirmzeile ben”tigt. Wenn man diese Zahl mit 400 der Anzahl der Zeilen multipliziert kommt man genau auf die 16000 Worte (oder 32000 Byte), die der Bildspeicher grož ist. Bei der niedrigen Aufl”sung ist alles etwas komplizierter. In dieser Aufl”sungsstufe hat man 16 Farben zur Verfgung d.h fr jeden Bildpunkt muž im Bildspeicher ein Wert zwischen 0 und 15 stehen, der die jeweilige Farbe des Punktes repr„sentiert. Um Zahlenwerte in diesem Bereich darzustellen ben”tigt man 4 Bit: 1510 = 1 * 23 + 1 * 22 + 1 * 21 + 1 = 11112 Da der Bildspeicher immer die gleiche Gr”že hat folgt daraus, daž man damit nur noch 1/4 der hohen Aufl”sung, eben 320 * 200 Pixel hat. Es bleibt jetzt noch zu kl„ren, wo die zu einem Punkt geh”rigen Bits zu finden sind. Die L”sung sieht so aus: Immer vier aufeinanderfolgende Worte im Bildspeicher ergeben 16 Farbpunkte auf dem Bildschirm und zwar bilden immer die vier Bits mit der gleichen Wertigkeit zusammengenommen den 4-Bitwert der ben”tigt wird. Fr den Punkt ganz links oben bedeutet das also: Man nehme die ersten vier Worte im Bildspeicher. Von jedem Wort das h”chstwertige Bit und schreibe diese Bits nebeneinander. Der Wert der sich dann ergibt entspricht der Farbe des Punktes.(Anmerkung fr Profis: Es ergibt sich natrlich nur der Index in die Farbpalette, das tut hier aber nichts zur Sache.Falls Sie das nicht ganz verstanden haben tr”sten sie sich, mir ging es anf„nglich genauso. Betrachten sie sich einfach einmal Bild_1 dann wird ihnen alles klar werden. Eine „hnlich Rechnung wie oben ergibt nun, daž man bei 320 Punkten a 4 Bit = 1280 Bit = 1280/16 = 80 Worte pro Bildzeile ben”tigt. Die Idee ist nun jedes Farbpixel durch einen Grauwert anzun„hern. Sie werden jetzt zu Recht fragen woher ich denn Grauwerte nehmen will, wie ja allgemein bekannt ist bietet der Monochromemonitor, wie sein Name schon sagt nur weižestes Weiž oder schw„rzestes Schwarz und dazwischen ist nichts. Hier kommt nun eine Methode zum Zuge, die schon in den ersten Anf„ngen der Computergraphik beliebt und bekannt war. Der Trick ist: Aus einer angemessenen Entfernung betrachtet verschwimmen mehrere Pixel zu einem Fleck der umso dunkler wird, je h”her die Pixelkonzentration wird. Man nehme also z.B. eine 2 * 2 Matrix und flle sie nach und nach mit Pixeln an und schon hat man fnf Grauwertstufen zur Verfgung. Bild_2 zeigt wie ich die Verteilung fr NEO2MONO gew„hlt habe. Die vier Bit Farbinformation werden also auf vier Pixel in in der Grauwertmatrix abgebildet. Jetzt haben sie alles an Grundlagen zusammen um das Konvertierungsprogramm verstehen zu k”nnen. Das Programm zerf„llt in drei Hauptbestandteile: Einlesen des Farbildes aus einer Neochromedatei, Konvertieren des Bildes direkt auf den Bildschirm und falls gewnscht Abspeichern des konvertierten Bildes auf Diskette. Zum Einlesen und Abspeichern ist nicht viel zu sagen. Es werden nicht die C Standardroutinen benutzt, da diese im Allgemeinen zu langsam sind, sondern direkt die Schnittstellen die das ATARI TOS anbietet. Ein Bild kann dadurch von der RAM-Disk in weniger als 2 Sekunden geladen werden. Beim Laden des Bildes wird zuerst ein Vorspann von 128 Byte berlesen. Dieser enth„lt globale Information zum Bild, wie zum Beispiel die Farbpalette. Ich benutze diese Informationen allerdings nicht in meinem Programm. An dieser Stelle ergeben sich noch Verbesserungsm”glichkeiten, denen sie gerne einmal nachgehen k”nnen. Das Farbbild wird in einen integer Array namens buff geladen und von dort aus weiterverarbeitet. Eine andere M”glichkeit w„re es das Bild "in situ" also direkt im Bildschirmspeicher zu konvertieren. Bei dieser Methode mžte allerdings jedes Bit des konvertierten Bildes seperat gesetzt und gel”scht werden, w„hrend meine Methode das simultane Verarbeiten von jeweils zwei nebeneinanderliegenden Bits erlaubt -- daraus folgt zusammen mit einigen anderen Dingen mehr als doppelte Geschwindigkeit. Aužerdem ist der Atari ein Rechner, bei dem man nun ja wirklich nicht mit Speicher zu geizen braucht. Die eigentliche Konvertierung erfolgt in der Funktion convert() innerhalb der drei verschachtelten for-Schleifen. Die Schleife mit dem Index y l„uft ber die Zeilen des Farbbilds, gleichzeitig werden die zwei long Pointer ptr1 und ptr2 hochgz„hlt. Sie zeigen jeweils auf den Anfang der zwei Grauwertzeilen, die sich aus der Konvertierung einer Farbzeile ergeben. Bild_3 zeigt, wie der erste Punkt einer Farbzeile konvertiert wird. Die Schleife Schleife mit dem Index x l„uft nun jeweils innerhalb einer Farbzeile in Sprngen von 4 Worten. Wie wir oben schon festgestellt haben ergen vier aufeinanderfolgende Speicherworte 16 aufeinanderfolgende Pixel im Farbbild. Diese 16 Pixel werden in der innersten Schleife mit dem Index bit errechnet. Die Funktion test() liefert zu jedem Punkt den Farbwert. Abh„ngig von diesem Farbwert werden nun jeweils zwei Bits in den long Variablen l1 und l2 gesetzt. Da aus einem Farbpunkt zwei nebeneinanderliegende Bits in l1 bzw l2 werden fllt die bit-Schleife gerade die zwei Variablen, so daž diese nach Verlassen der Schleife an die Stellen des Bildspeichers geschrieben werden k”nnen, auf die ptr bzw ptr2 zeigen. Das ist schon die ganze Konvertierung. Wer die Erkl„rung beim ersten Durchlesen schon verstanden hat kann sich gratulieren Die Konvertierung ist brigens nicht bijektiv, das heižt sie l„žt sich nicht umkehren. Um eine eindeutige Abbildung zu erhalten mžte man jeden der 16 Farbwerte in eines von 16 Graumustern verwandeln. Das bedeutet statt einer 2 * 2 Matrix muž man eine 4 * 4 Matrix mit Pixeln fllen. Um das ganze Bild so auf den Monochromemonitor bringen zu k”nnen mžte dieser allerdings eine Aufl”sung von 1380 * 800 Punkten haben. Wer keinen C-Compiler hat oder zu faul ist das Programm abzutippen kann die lauff„hige Version zusammen mit den Neochromebildern auf der Public Domain Diskette bestellen. Bild_4 zeigt ein mit NEO2MONO konvertiertes Bild.