Virtual OS/2 International Consumer Education
VOICE-Homepage: http://de.os2voice.org
Januar 2004

Inhaltsverzeichnis
< Vorherige Seite | Nächste Seite >
Artikelverzeichnis

editor@os2voice.org


OS/2-Multimedia-Strukturen mit REXX erschließen

Von Armin Schwarz © Januar 2004, Übersetzung: Torsten Schulz

Wollten Sie jemals eine Bilddatei von einem zu einem anderen Format konvertieren, ohne das Internet nach OS/2-Anwendungen durchsuchen zu müssen, die das gewünschte Format unterstützen? Wollten Sie die Konvertierung schon einmal von Ihrem eigenen Programm aus durchführen, ohne das Rad neu erfinden und sogar noch Ihre eigene Konvertierungsroutine schreiben zu müssen? Wollten Sie schon einmal ein Bild aus Ihrem eigenen REXX-Programm heraus anzeigen, aber das GUI-Toolkit unterstützte das jeweilige Bildformat nicht?

Wenn die Antwort zu diesen Fragen ja ist, könnte dieser Artikel für Sie von Interesse sein. Selbstverständlich ist dieses Thema mehr an Entwickler gerichtet, aber wenn Sie ein wenig REXX können, werden Sie in der Lage sein, Ihr eigenes Skript zu schreiben, um grundlegende Konvertierungen und sogar Bildbearbeitung ohne Schweißausbrüche durchzuführen.

Vor kurzem benötigte ich die Umwandlung von Bildern in einem meiner Projekte. Die einfache Aufgabe war, BMP- in JPG- oder GIF-Dateien umzuwandeln, so daß sie schneller über das Internet verschickt werden konnten. Es ist eine ganze Anzahl von Kommandozeilen-Bild-Konvertern verfügbar, die dies können, aber es müßte einen eleganteren und kompakteren Weg geben.

Nachdem ich das OS/2-Dev-Toolkit durchgesehen hatte, fand ich einen einfachen Image-Browser, der nicht nur Bilder anzeigen würde, sondern es auch ermöglichte, eine Anzahl verschiedener Formate zu konvertieren. Das war genau das, was ich brauchte. Ich sah den Code und die Multimedia-Dokumentation durch und bekam im Nu heraus, wie ich dies von meinem eigenen Programm heraus machen konnte. Na ja, ich brauchte schon ein bißchen länger.

Der Retter naht: REXX

Ich muß zugeben, daß es nicht so einfach war, die Geheimnisse der Bildkonvertierung zu entschlüsseln. Das Dev-Toolkit beinhaltet drei Dokumente zur Multimedia-Referenz, die ziemlich technischer Natur sind. Sie halfen schon, aber die beste verfügbare Dokumentation waren nur die Beispiele des C-Quell-Codes. Da das Beispielprogramm Image-Browser genügte, sollte es eigentlich einen einfacheren Weg geben, um Zugriff auf die Multimedia-Routinen der Bildkonvertierung zu erhalten.

OS/2 hat die Voraussetzungen, die Kontrolle von Multimedia mit Hilfe der Sprache REXX (REXXMCI) zu ermöglichen, aber es wird nur eine Auswahl an Befehlen unterstützt, und die meisten befassen sich mit der Kontrolle von Multimedia-Geräten. Unglücklicherweise war Bildkonvertierung keiner davon.

Das Fehlen dieses Features forderte eine Lösung, und das Ergebnis war eine kleine DLL für REXX, welche Routinen zur Bildkonvertierung beinhaltet, die unterstützte Bildformate findet und die Bildgröße und -auflösung eines bestimmten Bildes meldet. All diese Funktionen waren schon in das Multimedia-Subsystem jeder OS/2- oder eCS-Installation eingebaut, und die DLL agiert eigentlich nur als Zwischenglied zwischen dem REXX-aufrufenden Code und dem Multimediasystem.

Hier ist ein Beispiel-REXX-Skript, um TEST.BMP nach TEST.GIF zu konvertieren. Von der Quelldatei (TEST.BMP) wird angenommen, daß sie eine nichtkodierte Bitmap mit 24 Bit Farbtiefe (OS/2- oder Windowsformat) ist.

/*TESTCVRT.CMD */
/*load RXMMIO.DLL */
CALL RXFuncAdd 'rxMIOLoadFuncs', 'RXMMIO', 'rxMIOLoadFuncs'
CALL rxMIOLoadFuncs
/* convert the BMP image to GIF, flags are for TIF and PCD formats */
rc = rxMIOConvert('TEST.BMP', 'TEST.GIF', 0, -1)
/* Error handling */
IF rc = 0 THEN
SAY "rxMIOConvert successful"
ELSE
SAY "Conversion error = " || rc
/* drop the DLL */
CALL rxMIODROPFuncs
EXIT

Nicht zu kompliziert, oder?

[Anmerkung: Als ich diesen Artikel vorlegte, habe ich die DLL um eine "richtige" Bildformat-Erkennung erweitert. Einige Entwickler erwähnten, daß ihnen Bilder begegneten, die z.B. von GIF nach PNG umbenannt wurden. Die Erweiterung kann jetzt das wirkliche Format erkennen, indem sie den Bild-Header analysiert. Das wird alles im neuesten Archiv dokumentiert.]

Unterstützte Bildformate

Welche Bildformate werden vom OS/2- oder eCS-Basissystem unterstützt? Das können wir durch eine Funktion in rxmmio.dll herausfinden. Hier ist das Ergebnis von eCS 1.1:

1 TIF FAX Compressed
2 TIF Motorola Uncompressed
3 TIF Motorola Compressed
4 TIF Intel Uncompressed
5 TIF Intel Compressed
6 TGA Image Uncompressed
7 TGA Image Compressed
8 PCX Image Compressed
9 GIF Image Compressed
10 Baseline JPEG
11 IBM OS/2 2.0 BMP
12 IBM OS/2 1.3 PM Bitmap Image
13 MS Windows DIB Image
14 IBM MMotion Still Video Image
15 IBM AVC Still Video Image
16 RIFF DIB Image
17 Kodak PhotoCD

Bei einem OS/2-Warp-4-System sieht es genauso aus. Wie Sie sehen können, sind grundsätzliche Bildformate wie BMP, TIF, GIF und JPG enthalten. Dieselbe Funktion gibt auch Rückmeldungen über installierte Formate für Audiodateien, digitale Bilddateien, Filme und MIDI-Dateien.

Unglücklicherweise wurden die OS/2-Multimedia-Bildkonverter (IOProcs) nicht sehr konsequent auf den neusten Stand gebracht. Es sind nur zwei Updates verfügbar. Es gibt eine erweiterte JPG-IOProc [Anm. d. Übers.: Funktion], die progressives JPG unterstützt. Diese wird mittels Chris Wohlgemuths CW-Classes (http://www.os2world.com/cdwriting/mmclasses/mmclassesold.htm) zur Verfügung gestellt. Die JPEG-Unterstützung basiert auf dem "Generalized Bitmap Module" (GBM). Leider wurden die CW-Classes eingestellt. Die Gründe finden Sie hier (http://www.os2world.com/cdwriting/mmclasses/mmclassesmain.htm).

Eine PNG-IOProc-Funktion, die nur die Anzeige von PNGs ermöglicht, ist auf Hobbes (http://hobbes.nmsu.edu/pub/os2/apps/graphics/viewer/mmiogpng.zip) verfügbar. Das Speichern als PNG (Konvertierung zu PNG) ist nicht möglich, weil eine PNG-Encoder-Routine nicht enthalten ist, siehe weiter unten zu Links zu diesen Programmen. RXMMIO.DLL ist auch programmiert, um mit diesen zusätzlichen IOProcs-Funktionen und neuen oder aktualisierten Konvertern zu arbeiten.

Das Multimedia-System wurde als offenes System entworfen, um es zusätzlichen IOProcs zu ermöglichen, von anderen Anbietern ergänzt zu werden oder sogar vorhandene zu ersetzen. Gibt es vielleicht jemanden, der die Herausforderung annimmt, eine IOProc-Funktion für die vollständige Unterstützung für PNG zu schreiben? Beispiel-Code für IOProcs ist im Dev-Toolkit verfügbar.

Wie gut funktionieren diese IOPROCs? Ein paar schnelle Performance-Vergleiche zwischen den Multimedia-Bildkonvertierungsroutinen (MMPM/2), Globalized Bitmap Module (GBMREF) und NConvert v3.16 erbrachte folgende Daten:

GBMREF NConvert
BMP nach GIF -308% -292%
BMP nach PCX +43% +20%
BMP nach JPG *1* +59%
BMP nach TGA +56% +65%
BMP nach TIF +53% +43%
GIF nach BMP 0% -50%
GIF nach JPG *2* -5%
GIF nach PCX -32% -79%
PCX nach BMP 0% +36%
PCX* nach JPG* +49% +52%
PCX nach GIF -430% -3%
JPG* nach BMP* -62% -3%
JPG* nach PCX* +10% -13%
JPG nach GIF *2* -318%

Anmerkungen: Alle Bilder, außer den mit (*) markierten, sind 8-bittig (GBMREF unterstützt das Lesen von 24-Bit-BMPs nicht). Alle mit (*) markierten Bilder sind 24-bittig. Die Tests wurden mit installierten CW-Classes 0.2.5 ausgeführt, welche eine aktualisierte JPG-Unterstützung für OS/2 durch das GBM zur Verfügung stellen.

  1. GBMREF unterstützt das Lesen von 24-bit-BMPs nicht und nur 24-bit-JPGs. MMPM/2 hat diese Einschränkung nicht.
  2. GIFs haben nur 8 Bit und GBMREF kann nicht von/nach 24-bit-JPG umwandeln. MMPM/2 hat diese Einschränkung nicht.

Diese Daten wurden an die Konvertierungszeiten von MMPM/2 angepaßt. Prozentwerte im positiven Bereich bedeuten, daß der Geschwindigkeitsvorteil bei MMPM/2 liegt. Negative Prozentwerte geben an, daß der Geschwindigkeitsvorteil entweder bei GBM oder NConvert liegt. BMP-Umwandlung zu PCX, TGA oder TIF werden von MMPM/2 durchaus unterstützt und sind schnell. Die Umwandlung eines Bildes nach GIF mit Hilfe von MMPM/2 ist ziemlich langsam. Es gibt eine merkliche Verzögerung, bevor der Prozeß beendet wird, sogar mit kleinen Bildern. Wenn Sie nicht gerade hunderte von Bildern pro Tag konvertieren, müssen Sie sich nicht fragen, ob Geschwindigkeit hier wirklich ein Thema ist.

Bitte beachten Sie: Diese Umwandlungstests wurden mit Aufrufen aus einem REXX-Skript heraus gemacht, und die Ausgabe wurde in eine Datei umgeleitet, um die Ausgabe auf den Bildschirm zu minimieren. GBMREF wurde in der Form

GBMREF test.bmp test.gif

aufgerufen, und für NConvert war der Aufruf

NCONVERT -quiet -out gif -o test.gif test.bmp

Das stellt ordentliche Vergleichbarkeit zwischen allen drei Methoden sicher. Der Hauptgedanke hierbei ist zu zeigen, wie praktikabel es ist, diese Bildumwandlungsroutinen von einem REXX-Skript aus unter Real-World-Bedingungen aufzurufen. Es ist überhaupt nicht beabsichtigt, Umwandlungszeiten jeder Methode zu messen. Sie können jetzt selbst entscheiden, ob Ihnen eine dieser Methoden gefällt.


Bild 1: Geschwindigkeitsvorteil bei der Konvertierung für MMPM/2


Bild 2: Geschwindigkeitsnachteil bei der Konvertierung für MMPM/2 (alle Werte die 80% übertrafen, wurden wegen des Maßstabs bei 100% abgeschnitten)

BMP-Dateien mit mehreren Bildern

Das OS/2-Bitmap-Format führte das Bitmap-Format in einer Datei mit mehreren Bildern ein. Ursprünglich war es konzipiert, um entsprechende Bilder an die Bildschirmauflösung für bessere Bildpräsentation anzupassen. Eine Bilddatei könnte z.B. ein Bild mit der Bildschirmauflösung 640x480 und eines mit 800x600 und ein weiteres drittes mit 1024x768 enthalten. Das Bildbetrachtungsprogramm muß sich der Bildschirmauflösung bewußt sein und das verfügbare Bild entsprechend auswählen. Der OS/2-Symboleditor und PMView 2000 sind zwei solche Programme, die BMPs mit mehreren Bildern berücksichtigen, und man kann diese Programme nutzen, um ein individuelles Bild auszuwählen.

Diese BMPs mit mehreren Bildern können eine beliebige Anzahl von Bildern (nur durch den verfügbaren Plattenplatz eingeschränkt) enthalten. Die Größe kann unterschiedlich sein und kann sogar verschiedenartige Bilder enthalten. Das Multimediasystem von OS/2 enthält Routinen, die solche Bilder erzeugen und extrahieren können. Rxmmio.dll ermöglicht den Zugang zu jenen Routinen und ist in der Lage, BMPs mit mehreren Bildern zu erzeugen. Es können auch einzelne Bilder herausgezogen werden. Die Kodak-PhotoCD-Dateien (PCD) sind auch Dateien mit mehreren Bildern, und das OS/2-Multimedia-System ist fähig, dieses geschützte Format zu lesen. Rxmmio.dll kann einzelne Bilder von PCDs auslesen und sie in jedem von MMPM/2 unterstütztem Schreibformat speichern. Sollten Sie Bilder auf einer Kodak-PhotoCD haben, können Sie die benötigte Auflösung der Bilder mit Hilfe eines einfachen REXX-Skripts auslesen und als Bitmaps speichern, um sie dann weiter zu verarbeiten.

Einfache Bildverarbeitung

Rxmmio.dll bietet eine Anzahl oft genutzter Funktionen zur Bildmanipulation. Diese Funktionen sind nicht an das OS/2-Multimedia-System gebunden. Alle Bildverarbeitungsfunktionen unterstützen nur 24-bittige, nicht-kodierte BMPs, die das Multimedia-System standardmäßig erzeugt, wenn es BMPs in ein anderes Format umwandelt. Wenn Sie RLE24-kodierte BMPs haben, gibt es eine Funktion, die dieses Format zu nicht-kodierten 24-Bit BMPs umwandelt.

Es sind die Funktionen Trim (Zuschneiden), Size (Größenänderung) und Enlarge (Zoom) (Vergößern) enthalten. Bei Trim wird die angegebene Anzahl von Pixeln vom Rand des Bildes entfernt. Individuelle Werte für die Ränder oben, unten, links und rechts können angegeben werden.

Size reduziert das Bild bis zu einem gewünschten Wert, indem es Reihen und Spalten von Pixeln entfernt. Diese Funktion kann zum Erzeugen von Thumbnails genutzt werden. Das Ergebnis der Teilung der Originalgröße und der neuen Größe muß ganzzahlig sein, damit die Größenänderung vernünftig funktioniert. Beispielsweise ist eine Änderung eines Bildes von 640x350 zu 320x175 gültig. Eine Verringerung desselben Bildes zu 200x100 ist nicht gültig. Dies ist vom Design her bewußt angelegt worden, um den Algorithmus einfach zu halten. Aber er sollte sich trotzdem für viele Anwendungen als nützlich erweisen. Höhe und Breite können mit entsprechenden Werten individuell geändert werden.

Die Funktion Zoom multipliziert jeden Pixel mit dem Faktor 2, 3 oder 4. Das Vergrößern des Bildes jenseits dieser Werte resultiert in einem zu körnigen (pixeligem) Bild.

Auch sind Funktionen dabei, um ein Bild in Graustufen umzuwandeln, aufzuhellen, dunkler zu machen und Negative zu erzeugen, die einfach die Farben invertieren. Diese könnten beim Drucken von Nutzen sein.

Andere Multimedia Dateiformate

Rxmmio.dll verarbeitet nur Bilddateiformate, aber das OS/2-Multimedia-System unterstützt auch Formate für Audio-, Video- und MIDI-Dateien. Das Umwandeln dieser Formate ist eingebaut und erreichbar durch ein Pull-Down-Menü mit den CW-Classes für z.B. Audiodateien. Sounddateiformate werden ebenfalls unterstützt dank MMAudio Pak 2.0, welches MP3-, OGG- und FLAC-Audiodateien vollständig in die Workplace-Shell integriert. Informationen zum MMAudio-Pak siehe http://math.berkeley.edu/~roconnor/MMAudioPak/.

Die Unterstützung für Videodateien ist seit 1996 im wesentlichen nicht geändert worden. Grundsätzlich ist das Betrachten von AVI und MPEG-1 möglich, aber Audio wird mit erhöhter Geschwindigkeit wiedergegeben, was bei MPEG-1-Filmen einen Eichhörnchen-Sound ergibt. Das Programm Video IN, das Teil des Bonus-Pak ist, handhabt Konvertierungen von Videodateien, aber die Unterstützung ist auf heutzutage überholte Formate begrenzt. Die Video-IN-Installation richtet auch das AVI-Datei-Utility ein, das Informationen zu Videodateien gewinnt und AVI-Dateien aus Bilddateien erzeugt. Sie können recht einfach animierte Filme erzeugen oder Photos in Zeitschleifen zusammenheften und diese mit Audiodateien mischen.

Die Umwandlung von Sound- und Videodateien aus einem REXX-Skript heraus, ähnlich wie mit rxmmio.dll für Bilddateien, ist sicherlich möglich. Die Strukturen sind vorhanden. In Zukunft müssen sie nur noch erschlossen werden.

Wird sich die fehlende Unterstützung für bestimmte Bild- und Videoformate jemals ändern? Es sind sicherlich keine trivialen Projekte, die dann auf sich genommen werden. Wir als Nutzer von OS/2 oder eCS können einen kleinen Anteil leisten, in dem wir Entwickler, die in der Vergangenheit diese Herausforderung auf sich genommen haben, ermutigen. Geben Sie ihnen (immer) positive Rückmeldung und kritisieren Sie konstruktiv (wenn nötig). Nur die Zeit wird zeigen, ob jemand kommt und die Lücke schließt.

Mit rxmmio.dll können Sie nun auf einfache Weise jegliche von OS/2-Multimedia unterstützten Bilder manipulieren, konvertieren und sie sogar mit REXX-GUI-Application-Development-Systemen wie Dr. Dialog oder ähnlichen anzeigen. Für den privaten Gebrauch ist es kostenlos. Wenn Sie Freeware entwickeln, können Sie die DLL ohne Lizenzgebühren einbeziehen. Sie erhalten das Paket entweder von Hobbes oder der VOICE-Webseite.

Daten und Quellen:

RXMMIO.DLL (RXM129.ZIP): http://www.os2voice.org/files/RXM129.ZIP
Das OS/2 Dev Toolkit liegt eComStation 1.1 bei. Siehe: http://www.ecomstation.com/
Der für rxmmio.dll benutzte Compiler ist OpenWatcom. Auch diese liegt eCS 1.1 bei. Die neueste Version gibt es hier: http://www.openwatcom.org
Bei weiterem Interesse an MM/2 und IOProcs sollten sie mit diesem Artikel auf der EDM/2-Seite beginnnen: http://www.edm2.com/0403/mmio.html
DrDialog: http://hobbes.nmsu.edu/cgi-bin/h-search?key=drdialog


Armin Schwarz ist ein langjähriger OS/2-Entwickler von solchen Anwendungen wie House/2 zur Steuerung von X-10 Geräten, eines UPS-Monitors für viele UPS-Marken, Cumulus for the Oregon Scientific, eines kabellosen Wetterstationsmodells und anderen. Sie können seine Homepage unter Lone Peak Automation besuchen.

Artikelverzeichnis
editor@os2voice.org
< Vorherige Seite | Inhaltsverzeichnis | Nächste Seite >
VOICE-Homepage: http://de.os2voice.org