Verwenden Sie professionelle Grafiken im BMP-Dateiformat in Ihren eigenen Programmen!

.ZIP neu erstellen!!!!!!!!!!!

Einleitung

Bestimmt ist auch Ihre PC-Anlage mit einem Scanner ausgerüstet. Entsprechend leistungsfähige Windows-Applikationen stehen Ihnen für die Bildbearbeitung zur Verfügung. Sie haben daneben noch eine tolle Idee für eine neues QuickBASIC-Spiel, doch wie bringt man das Bildmaterial aus dem Internet und Ihren Windows-Programmen ins BASIC hinein? Die hier vorgestellte Bibliothek räumt Ihnen diese Barriere weg. Lesen Sie auch dazu den Artikel über die Verwendung professioneller Grafiken.

Als praktische Anwendungen ist das Kisten-Schiffspiel zu erwähnen, ebenso wurden beinahe alle Bildschirm-Schnappschüsse, welche Sie hier sehen, mit dieser Bibliothek erstellt!

Grundkonzept

Diese Bibliothek arbeitet im Gegensatz zu vielen anderen Dateiladern nicht direkt über den Videospeicher, sondern über das bei GET und PUT verwendete Feld.

Warum für den BASIC-Compiler eine separate Version?

Der QuickBASIC-Compiler (QB.EXE) besitzt im Gegensatz zu QBASIC.EXE die Möglichkeit, mit CALL INTERRUPT Systemaufrufe vorzunehmen, was diverse Zusatzfunktionen möglich macht. Daher müssen sich QBASIC.EXE-Programmierer mit einer abgespeckten Version begnügen.

Kurzeinführung

Diese Kurzeinführung kann mit beiden Versionen nachvollzogen werden.

Bilder laden

Die SUB-Prozedur

LadeBild dn$, f%(), ind%

dient zum Laden der Bilddatei dn$ nach f%() ab Index ind%. Bei der Compiler-Version wird der Datentyp DOUBLE (#) für das Feld verwendet, um grössere Speicherblöcke zu ermöglichen. Der Dateiname wird dabei immer ohne .BMP-Endung angegeben.

Erstellen Sie mit dem bei jeder Windows-Version mitgelieferten Programm Paint ein kleines Bild, und speichern Sie es als 256-Farbenbild in Ihrem BASIC-Verzeichnis als MEINBILD.BMP ab. Dieses Bild können Sie mit

' $INCLUDE: 'bmp_lib.bi'
DIM f%(10000)
LadeBild "meinbild", f%(), 0

einlesen und mit

SCREEN 13
PUT (20, 10), f%, PSET

auf den Bildschirm zaubern. Allerdings haben Sie im Moment noch mit grösster Wahrscheinlichkeit ein total verfärbtes Bild. Grund: Jede Bilddatei besitzt noch eine Farbpalette, die Sie mit

DIM pal&(255)
LadePalette "meinbild", pal&(), 0, PalVGA%

laden und mit

PALETTE USING pal&

anwenden können - et voilà! - jetzt kommt das Bild auch in seinen korrekten Farben! :-)

Ermittlung der Bildeigenschaften

Häufig kommen Situationen vor, bei welchen Sie zum vornherein noch nicht wissen, wie gross die f%()-Feldvariable dimensioniert werden muss. Mit der Prozedur

HoleBildInfo dn$, br&, hoe&, farbtiefe%, feldgroesse%

können Sie diese generellen Informationen vom Bild dn$ hineinholen. Das Beispielprogramm

HoleBildInfo "meinbild", b&, h&, ft%, gr%
PRINT "MEINBILD.BMP ist"; b&; "x"; h&; "Pixel gross und besitzt"
PRINT 2! ^ csng(ft%);"Farben => Um es einzulesen, muss man"
PRINT "DIM f%("; gr% - 1; ") das Feld dimensionieren"

liefert Ihnen dann beispielsweise

MEINBILD.BMP ist 113 x 17 Pixel gross und besitzt
 256 Farben => Um es einzulesen, muss man
DIM f%( 962 ) das Feld dimensionieren

Bild abspeichern

Auch das Gegenstück, ein Bild speichern, ist vorhanden:

SpeichereBild dn%, f%(), indf%, pal&(), indp%, farbtiefe%, palettenmodus%

Das folgende Beispiel erzeugt eine Datei KREISE.BMP:

SCREEN 7
DIM p&(15)
FOR i%=0 TO 15
  p&(i%) = CLNG(i%)
NEXT i%
PALETTE USING p&

FOR i%=1 TO 15
  CIRCLE(45, 45), 3 * i%, i%,,,1!
NEXT i%

DIM kreise%(3000)
GET(0, 0)-(90, 90), kreise%
SpeichereBild "kreise", kreise%(), 0, p&(), 0, 4, PalCGA%

Dieses Bild können Sie nun beispielsweise in Windows Paint öffnen!

Fundamentale Details, auf die Sie achten müssen

SCREEN-Modi und Unterformate

Von Microsoft definierte Datei-Unterformate

Für eine .BMP-Bilddatei existieren verschiedene Untervarianten:

Welche Unterformate werden unterstützt?

Die aktuelle Version von BMP_LIB.BAS unterstützt noch keine Kompression, erkennt aber immerhin entsprechende Bilder und liefert eine entsprechende Fehlermeldung zurück. Ebenso können aufgrund nicht vorhandener Echtfarb-SCREEN-Modi auch keine 24-Bit-Bilder verwendet werden (Fehlermeldung).

Grundregel:

Die Farbtiefe muss immer mit jener des entsprechenden SCREEN-Videomodus übereinstimmen!

Zu wählende Bildspeicheroptionen
BASIC-VideomodusIn Windows-Applikationen als Dateityp einzustellen (Paint)
SCREEN 2, SCREEN 11Monochrom-Bitmap (*.bmp, *.dib)
SCREEN 7, SCREEN 8, SCREEN 9, SCREEN 1216-Farben-Bitmap (*.bmp, *.dib)
SCREEN 13256-Farben-Bitmap (*.bmp, *.dib)

Bei Programmen wie Corel Photo-Paint, Photoshop muss noch zusätzlich Unkomprimiert gewählt sein.

SCREEN 1 und SCREEN 10 können nicht verwendet werden, weil von Microsoft kein 2 bpp (Bits pro Pixel)-Unterformat mit 4 Farben definiert wurde.

Farbpaletten-Systeme

Das Grundkonzept vom PALETTE-Befehl wurde seinerzeit von Microsoft sehr unglücklich gelöst: Je nach Videomodus gelten andere Regeln für den Farbwert und Wertebereich davon. In .BMP-Dateien sind aber die Farben wie auch bei allen übrigen Bildformaten üblich als RGB (Rot-Grün-Blau)-Werte gespeichert. Die beiden Prozeduren LadePalette sowie SpeichereBild haben daher die entsprechenden Konvertierungsalgorithmen bereits eingebaut.

Werte für mo%
BASIC-VideomodusWert für Palettenmodus
SCREEN 1, SCREEN 2, SCREEN 7, SCREEN 8PalCGA%
SCREEN 0, SCREEN 9PalEGA%
SCREEN 11, SCREEN 12, SCREEN 13 PalVGA%

Das Genauigkeitsverlustproblem bei den Farben

Falls Sie eine Bildverarbeitung beabsichtigen, wo Sie etwas beliebiges laden und anschliessend speichern, besteht jedoch ein kleines Problem: Es geht Genauigkeit verloren! PalVGA% rundet diese 8 Bits (0-255) auf 6 Bit herunter (0-63), bei PalEGA% erfolgt eine Reduktion gar auf 2 Bits.

' Hier entsteht eine Palettenverfärbung
SCREEN 9
DIM h%(10000), p&(15)
LadeBild "original", h%(), 0
LadePalette "original", p&, PalEGA%
PALETTE USING p&
PUT(0, 0), h%, PSET
' beliebige Verarbeitung noch vornehmen
GET(0, 0)-(139, 109), h%
SpeichereBild "ziel", h%(), 0, p&, 0, 4, PalEGA%

Auf diese Weise kommen höchstwahrscheinlich verfälschte Farben heraus:

Landschaftsbild vor der Verarbeitung Landschaftsbild nach der Verarbeitung
Ein Landschaftsfoto und wie es vor und nach der Farbpalettenrundung aussieht

Der verlustfreie Palettenmodus

Um diesen Verlust zu verhindern, gibt es noch den Pseudomodus PalVlf%, bei welchem wirklich jedes Farbwert-Bit erhalten bleibt.

' So entstehen keine Verluste mehr
SCREEN 9
DIM h%(10000), pNurFuerBildschirm&(15), pVerlustfrei&(15)
LadeBild "original", h%(), 0
LadePalette "original", pNurFuerBildschirm&, PalEGA%
LadePalette "original", pVerlustfrei&, PalVlf%
PALETTE USING pNurFuerBildschirm&
PUT(0,0), h%, PSET
' beliebige Verarbeitung noch vornehmen
GET(0, 0)-(139, 109), h%
SpeichereBild "ziel", h%(), 0, pVerlustfrei&, 0, 4, PalVlf%

Allerdings können mit PalVlf% eingelesene Paletten nicht mit PALETTE USING verwendet werden, daher wird hier die Palette für den Bildschirm noch separat eingelesen.

Für Trickfilm-Sprites: Der Startindex

Bereits zu Beginn erwähnte ich nur so nebenbei den überall vorhandenen Parameter ind%: QuickBASIC erlaubt Ihnen ja bekanntlich mehrere Bilder in einer Feldvariablen abzulegen. Wenn Sie also gut im Zeichnen sind, so empfehle ich Ihnen eine kleine Animation aus 16 Einzelbildern zu zeichen, jedes als 16-Farben-Bitmap abzuspeichern. Kleiner Tip dabei: Jeweils das Vorgängerbild geringfügig abändern und mit Speichern unter... ablegen. Alternativ können Sie auch eine animierte .GIF-Datei im Internet suchen und diese mit einem geeigneten Windows-Programm in Einzelbilder zerlegen. Sie sollten einfach schlussendlich TAENZ1.BMP, TAENZ2.BMP, ..., TAENZ16.BMP bekommen.

' Trickfilm ab Dateien
HoleBildInfo "taenz1", xb&, yb&, bpp%, gr%
DIM h%(16 * gr% - 1), p&(15), indBild%(15)
SCREEN 7
LadePalette "taenz1", p&(), 0, PalCGA%
PALETTE USING p&
ind%=0

' Bilder laden
FOR i%=1 TO 16
  indBild%(i% - 1) = ind%
  LadeBild "taenz" + MID$(STR$(i%), 2), h%(), ind%
NEXT i%

' Darstellen
xPos% = 160 - CINT(xb&) \ 2
yPos% = 100 - CINT(yb&) \ 2

t! = TIMER
bildnr% = 0
WHILE INKEY$ = ""
  IF TIMER >= t! THEN
    PUT (xPos%, yPos%), h%(indBild%(bildnr%))
    bildnr% = bildnr% + 1 AND 15
    t! = t! + .1
  END IF
WEND

SCREEN 0
WIDTH 80, 25

Mit diesem Programm werden unsere 16 Einzelbilder als Trickfilm abgespielt.

Nur Interpreterversion: Speicherbegrenzung

In QBASIC.EXE können Felder bekanntlich nur maximal 64 KB gross dimensioniert werden, also

DIM f%(32767)

ist das Gröstmögliche. Für ein bildschirmfüllendes Titelbild im SCREEN 13-Modus genügt dies vollkommen, da 320×200×8 bpp+4 Byte Verwaltung 64'004 Bytes ergibt, was <65'536 ist. Dagegen nimmt im SCREEN 12-Grafikmodus ein ganzseitiges Bild 640×480×4 bpp + 4 Byte Verwaltung 153'604 Bytes ein, was diese 64 KB-Grenze deutlich übersteigt.

Bei der QBASIC.EXE-Version bleibt Ihnen daher nichts anderes übrig, als Ihr Titelbild TITEL.BMP in 4 »mundgerechte Portionen« TITEL_LO.BMP (Links oben), TITEL_RO.BMP, TITEL_LU.BMP und TITEL_RU.BMP aufzuteilen und diese mit

DIM t%(19201), p&(15)
SCREEN 12
LadePalette "titel_lo", p&, 0, PalVGA%
PALETTE USING p&
LadeBild "titel_lo", t%(), 0
PUT(0, 0), t%, PSET
LadeBild "titel_ro", t%(), 0
PUT(320, 0), t%, PSET
LadeBild "titel_lu", t%(), 0
PUT(0, 240), t%, PSET
LadeBild "titel_ru", t%(), 0
PUT(320, 240), t%, PSET
ERASE t%

laden und auszugeben.

Die Compiler-Version kennt dieses Problem glücklicherweise nicht mehr, wenn Sie beim Compiler mit /ah das sog. Large Memory Model aktivieren, wo Sie dann ohne weiteres

' Ganzseitiges Titelbild in einem Rutsch laden
' $INCLUDE: 'bmp_lib.bi'
DIM t#(19200), p&(15)
SCREEN 12
LadePalette "titel", p&, 0, PalVGA%
PALETTE USING p&
LadeBild "titel", t#(), 0
PUT(0, 0), t#, PSET
ERASE t#

verwenden können. Dies ist auch der Grund, weshalb die Compilerversion doppeltgenaue PUT-Felder verwendet: Damit können grosse Felder dimensioniert werden, dass der 16-Bit-Integerbereich für den Index immer noch ausreicht, während %-Integerfelder bei der QBASIC.EXE eine etwas effizientere Speicherausnutzung ergeben. Am Schluss sollten Sie mit Vorteil das Feld mit ERASE wieder freigeben, um den knappen, konventionellen Arbeitsspeicher nicht unnötig zu verschwenden!

Erweiterungen der Compilerversion

Nebst dem Unterschied, dass das Feld vom Typ # statt % ist, die 64 KB-Grenze wegfällt und die Bibliothek überhaupt sauber mit ' $INCLUDE: 'bmp_lib.bi' eingebunden werden kann (bei QBASIC.EXE ist leider nur Copy&Paste-Programmiertechnik möglich!), bietet sie noch einige wirklich nützliche Zusatzfunktionen, die im folgenden beschrieben werden.

Einbindung in eigene Projekte

Die Compiler-Version liegt als separates Bibliotheksmodul BMP_LIB.QLB zusammen mit dem Quelltext vor, welches Sie in Ihren eigenen Projekten mit

' $INCLUDE: 'bmp_lib'

einbinden können. Entsprechend müssen Sie den BASIC-Compiler mit

C:\BASICPRG>qb /l bmp_lib /ah meinprog

aufrufen.

Auslesen der Farbpalette

In der QBASIC.EXE-Version ist man beim Abspeichern stets gezwungen, eine Farbpalette selber zu definieren:

SCREEN 7
' Palette festlegen
DIM Pal&(15)
FOR i% = 0 TO 15
  Pal&(i%) = CLNG(i%)
NEXT i%
PALETTE USING Pal&

Eine Notlösung wäre eine spezielle Palettensetzprozedur, welche die Werte speichert:

DIM SHARED Pal&(15)

SUB LatchedPALETTE(i%, w&)
  Pal&(i%) = w&
  PALETTE i%, w&
END SUB

Häufig wollen Sie aber gerade diejenigen Farben verwenden, die unmittelbar nach dem SCREEN-Aufruf gesetzt werden, verwenden. Ebenso wollen Sie vielleicht in einem bereits bestehenden Programm den Bildschirminhalt abspeichern, ohne alle PALETTE-Aufrufe durch das obige ersetzen zu müssen.

Die Compilerversion stellt Ihnen daher zusätzlich die Prozedur LiesPalette zur Verfügung, welche die Farben direkt per VGA-BIOS aus den DAC-Registern herausliest. Daher können Sie das Beispiel mit dem Kreismuster von oben wesentlich eleganter formulieren:

' hier wie bisher Muster mit CIRCLE und PAINT erzeugen

DIM h#(926), Pal&(15)
GET (30, 21)-(164, 129), h#
LiesPalette Pal&(), LBOUND(Pal&), 16
SpeichereBild "Beispiel", h#(), LBOUND(h#), Pal&(), LBOUND(Pal&), 4, PalVGA%

Als Parameter übergibt man das Feld für die Paletten-Farbdaten, gewünschter Startindex sowie die Anzahl Farben des Bildes (16 im Beispiel). Die Farbwerte werden dabei immer im PalVGA%-Format ausgelesen. Ausserdem ist noch zu sagen, dass LiesPalette nur mit VGA-Grafikkarten und besser möglich ist. Da aber der VGA-Standard schon seit 1987 existiert, dürfte diese Einschränkung heutzutage kaum mehr ins Gewicht fallen, ausser Sie besitzen noch einen IBM PC/XT oder 286er-PC mit EGA- oder gar CGA-Grafikkarte.

Heutige PCI- und AGP-Grafikkarten erfüllen dieses Kriterium immer.

Intern berücksichtigt LiesPalette so ziemlich jede VGA-spezifische Spezialität wie DAC-Registergruppe, PEL-Maske usw., so dass die Farben beliebig kompliziert gesetzt sein dürfen.

Rundungsfreies VGA-Farbensetzen in jedem Videomodus

Eine ebenfalls nützliche Erweiterung ist die Prodedur PaletteUsingVGA, welche als Ersatz für PALETTE USING bei VGA-Karten (ist auch hier wieder die hardwaremässig minimale Voraussetzung) verwendet werden kann: Damit können Sie in jeder SCREEN-Auflösung die volle 262'144-VGA-Farbenpracht verwenden. Beispiel:

SCREEN 7
DIM Pal&(15)
LadePalette "C:\BASICPRG\CHAT", Pal&(), LBOUND(Pal&), PalVGA%
PaletteUsingVGA Pal&(), LBOUND(Pal&), 16

Landschaftsbild mit PALETTE USING Landschaftsbild mit PaletteUsingVGA
Ein Landschaftsfoto einmal mit PALETTE USING und einmal mit PaletteUsingVGA im SCREEN 7-Grafikmodus dargestellt

Man übergibt zuerst auch wieder das Feld sowie der Startindex, anschliessend noch die Anzahl Farben.

Wichtig: LadePalette muss vorher auch wieder völlig unabhängig vom SCREEN-Modus mit PalVGA% geladen werden. Ausserdem sollte man nicht mehr die normale PALETTE-Anweisung verwenden, da diese ja nichts von der DAC-Registeränderungen weiss und somit nicht mehr die gewünschten Farben liefert!

Textbildschirmausschnitt als Grafik umwandeln

Eine weitere Utility-Prozedur stellt ErzeugeTextGrafik dar: Damit kann man einen beliebigen Textbildschirmausschnitt in eine PUT-kompatible Grafik umwandeln. Parameter:

Abmessungen des Textbildschirmausschnitts
hellorange=gesamter Bildschirm, hellblau=gewünschter Ausschnitt

Als erste Parameter kommen das Ziel-PUT-Feld mit Startindex wie bei der ganzen Bibliothek üblich. Danach folgt der Ausschnitt gemäss obiger Skizze. Die beiden letzten Parameter sind die Farbtiefe (1=monochrom und 4=farbig) sowie die Pixelhöhe eines Zeichens (8, 14, 16 zulässig).

Achtung: Gemäss Seite 67 (Removal of Unused VGA Fonts) der VESA-Richtlinien ist es für die Grafikkarten-Hersteller zwecks BIOS-Speicherplatz-Einsparung zulässig, auf den 14-Punkte-Zeichensatz zu verzichten. Daher sollten Sie die 14-Punkt-Grösse lediglich als optionale Auswahlmöglichkeit in Ihren Anwendungen anbieten, aber niemals fest voraussetzen oder gar fest eincodieren!

Auf meiner ATI xpert@Work 8 MB AGP-Grafikkarte machte der Hersteller von dieser Möglichkeit Gebrauch. Da das VGA-BIOS kein Not supported-Flag liefern kann, bekommt man dort bei der Anforderung des 14-Punkte-Zeichensatzes nur notbehelfsmässig einen Zeiger auf die 16-Punkte-Schrift, was als 14-Punkt-Schriftdaten interpretiert eine entsprechend fehlerhafte Grafikdarstellung ergibt.

Alle 16 Hintergrundfarben im Textmodus statt Blinken

Eine kleine, jedoch sehr nützliche Prozedur ist SetzeBlinkattribut. Wenn Sie beispielsweise COLOR 18 verwenden, d.h. Wert >=16, so blinken die Zeichen normalerweise. Mit SetzeBlinkattribut 0 können Sie diesen Blinkmodus ausschalten und haben dafür alle 16 Farben auch für den Hintergrund zur Verfügung. Mit SetzeBlinkattribut -1 schaltet man den Blinkmodus wieder ein.

Hinweis: ErzeugeTextGrafik verarbeitet blinkende Zeichenfarbattribute immer als 16 Hintergrundfarben (8-15). Ausserdem ist noch zu bemerken, dass die MS-DOS-Eingabeaufforderung von Windows im Fenstermodus ebenfalls immer 16 Hintergrundfarben darstellt, da Blinken per Software im Windows-Grafikmodus ziemlich CPU-Zeit-aufwendig wäre. Im Vollbildmodus bzw. reinen DOS erfolgt das Blinken hardwaremässig.

Ganzer Bildschirm als Datei speichern

Ein wirklich schmackhaftes Bonbon dieser Bibliothek stellt die Prozedur SpeichereBildschirmAlsBMP dar: Damit können Sie den gesamten Bildschirminhalt direkt als .BMP-Datei speichern, und zwar unabhängig vom aktuellen SCREEN-Videomodus! :-) Insbesondere funktioniert die Routine auch mit dem SCREEN 0-Textmodus (greift direkt auf die Zeichendarstellungsdefinitionen des Grafikkarten-ROM zu).

Nahezu sämtliche Bildschirmschnappschüsse, welche Sie auf meiner gesamten Heimseite vorfinden, wurden direkt mit dieser Bibliothek erzeugt und anschliessend in Corel Photo-Paint in .GIF-Dateien konvertiert.

Daher erscheinen insbesondere Textbildschirm-Schnappschüsse in der originaltreuen VGA-Schrift, was bei einem PrtScreen-Schnappschuss aus dem Windows-Bildschirm heraus nicht der Fall wäre, ausserdem stimmt auch die Farbpalette der .GIF-Datei jeweils mit jener des DOS-Bildschirms perfekt überein.

Bildschirmmaske. Grösserer Umfang von 9½ KB
Originaltreue 16-Punkt-VGA-Darstellung bei dieser Bildschirmmaske

Hinweis für Windows 98-Besitzer: Dort können Sie die .GIF-Umwandlung auch direkt mit dem mitgelieferten Programm Paint (Start -> Programme -> Zubehör -> Paint) durchführen.

Als Parameter gibt man lediglich den Dateinamen ohne Endung sowie die Textzeichenhöhe in Pixel an, wobei letzterer Parameter nur bei SCREEN 0 gebraucht wird.

Achtung: Benutzerdefinierte Koordinaten, welche Sie mit WINDOW (x1!, y1!)-(x2!, y2!) erzeugt haben, müssen Sie vorher deaktivieren! Dazu müssen Sie WINDOW ohne Parameter aufrufen, um das Koordinatensystem wieder auf Integerkoordinaten zurückzusetzen.

In der Implementation von SpeichereBildschirmAlsBMP kommen nebst LiesPalette und ErzeugeTextGrafik auch entsprechende BIOS-Aufrufe zur Anwendung, um den aktuellen Videomodus sowie die Bildschirmdimensionen zu ermitteln.

Wie erstellt man Bildschirmschnappschüsse?

Zu diesem Zweck laden Sie Ihr Programm, welches Sie im Internet dokumentieren wollen, in den QuickBASIC-Compiler wie im Artikel über die Verwendung des BASIC-Compilers beschrieben. Dabei rufen Sie den BASIC-Compiler direkt mit /ah /l bmp_lib auf. In den Quelltext fügen Sie zu Beginn ' $INLCUDE: 'bmp_lib.bi' ein und suchen sich im Programm eine geeignete Stelle, an welcher Sie Ihren Bildschirmschnappschuss ausführen möchen. In einer Tastaturschleife fügen Sie beispielsweise einfach einen weiteren Block ein:

  DO
    t$ = INKEY$
  LOOP WHILE t$ = ""
  SELECT CASE t$
  CASE CHR$(0) + "H"
    ' ... <= bestehendes Programm
  CASE CHR$(24)
    SpeichereBildschirmAlsBMP "c:\temp\scrshot1", 16
  CASE ELSE
    ' ...

Verwenden Sie einfach eine Taste, welche Sie in der Abfrage noch nicht mit einer programmeigenen Funktion auswerten. Damit können Sie Ihre Anwendung wie gewohnt aufrufen und zum gewünschten Zeitpunkt die Tastemkombination Strg+X in diesem Beispiel drücken, worauf der Bildschirm abgespeichert wird.

Verwendung von Sprites

Diese Bibliothek eignet sich hervorragend für das Einlesen von Sprite-Grafiken bei bewegten Spielen zu Beginn. Dies ist auch der wesentliche Grund, weshalb überhaupt mit PUT-Datenfelder gearbeitet wird. Aufgrund der Natur von Paletten-Farbgrafik müssen Sie jedoch einige Dinge dabei beachten:

Sämtliche gleichzeitig darzustellenden Grafiken müssen gemeinsame Farben verwenden, d.h. alle .BMP-Bilddateien müssen eine identische Farbpalette aufweisen.

Bilder mit Corel Photo-Paint erstellen

Ein hervorragendes Werkzeug in diesem Zusammenhang stellt Corel Photo-Paint in der Version 8 dar. Als Beispiel wollen wir für ein Memory-Kartenspiel eingescannte Fotos für den SCREEN 12-Grafikmodus aufbereiten: Dazu erzeugen Sie zunächst mit Datei, Neu... eine genügend grosse leere 24-Bit-Bitmap und kopieren dort mit Bearbeiten, Aus Datei einfügen... sämtliche noch im 24-Bit-Format vorliegenden Kartenmotive hinein. Anschliessend rufen Sie Bild, Farbformat ändern -> Palette (8 Bit)... auf und reduzieren diese Hilfsgrafik auf 16 Farben, wobei Sie bei Palette opimiert als Farbpalette auswählen => Photo-Paint berechnet Ihnen eine für alle Bilder geeignete Farbpalette aus. Von dieser Hilfsgrafik brauchen Sie lediglich mit Bild, Farbtabelle..., Speichern unter... die Farbpalette als .CPL-Datei abzuspeichern, nicht das Bild selber. Anschliessend laden Sie Ihre einzelnen Kartenmotive und rechnen mit Bild, Farbformat ändern -> Palette (8 Bit)... jedes auf 16 Farben herunter, wobei Sie mit Öffnen... Ihre vorhin erzeugte .CPL-Datei als angepasste (Angepaßt) Farbpalette laden. In Ihrem BASIC-Programm brauchen Sie lediglich LadePalette auf ein beliebiges Bild anzuwenden und diese mit PALETTE USING einmalig zu Beginn setzen. Von allen übrigen Bilder laden Sie lediglich die PUT-Grafikdaten mit LadeBild hinein.

Hinweis: Im Kisten-Schiffspiel wurden die Dateien KISTE.BMP und SCHIFF.BMP mit der hier beschriebenen Technik aus JPEG-Dateien heraus erzeugt.

Bei anderen Bildbearbeitungsprogrammen können Sie analog vorgehen.

C++-Umsetzung

Die C++-Umsetzung entspricht streng genommen überhaupt nicht dem Aufbau der BASIC-Version, denn dieses Programm entstand eigentlich schon vor der BASIC-Version. Vielmehr finden Sie in DISP_BMP.CPP einen einfachen Bildbetrachter vor, welcher als grosses Highlight bei älteren Grafikkarten Ihre Bilddateien auf eine gerasterte Darstellung herunterrechnet. Die Farbpalette wird übrigens nach dem System vom Netscape erzeugt. Das Programm macht sich dabei die Tatsache zu nutze, dass ein Foto in der Regel nicht alle 216 Farben des Netscape-Farbwürfels benötigt; vielmehr können Sie zu Beginn selber eine Würfelkantenauflösung mitgeben (maximal 20). Reichen dabei die Farben nicht aus, so wird diese Auflösung um 1 reduziert und nochmals von vorne begonnen, solange, bis die Farben ausreichen. Daneben können Sie das Bild auch in den Bildschirm einpassen.

Dagegen bietet Ihnen BMP_SPEI.CPP analog SpeichereBildschirmAlsBMP der BASIC-Version auch eine Bildschirmspeicherfunktion an. Dabei wird in der Implementation intensiven Gebrauch der Videomodus-Abfragefunktionen der GRX-Grafikbibliothek gemacht.

Da GrQueryColor() keine DAC-Register ausliest, müssen Sie ähnlich der QBASIC.EXE-Version auch sämtliche Farben mit GrSetColor() explizit setzen! Sonst wird nur Schwarz zurückgegeben!

Im Gegensatz zur BASIC-Version arbeitet die C++-Version auch mit 24-Bit-.BMP-Dateien sowie Echtfarb-Videomodi zusammen, was Ihnen eine perfekte Fotoqualität beim Betrachten liefert.


Microsoft QuickBASIC®-Logo aus Windows® Version für QuickBASIC-Compiler herunterladen

Umfang: 57 KB


Microsoft QuickBASIC®-Logo aus Windows® Version für QuickBASIC-Interpreter herunterladen

Umfang: 18 KB


Titel »djgpp« vom GNU-C++-Compiler für DOS Version für DJGPP herunterladen

Umfang: 67 KB + Laufzeitumgebung 59 KB


Zurück ins Downloadmenü


© 2000 by Andreas Meile