.ZIP neu erstellen!!!!!!!!!!!
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!
Diese Bibliothek arbeitet im Gegensatz zu vielen anderen Dateiladern nicht
direkt über den Videospeicher, sondern über das bei GET
und PUT
verwendete Feld.
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.
Diese Kurzeinführung kann mit beiden Versionen nachvollzogen werden.
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! :-)
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
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!
Für eine .BMP-Bilddatei existieren verschiedene Untervarianten:
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!
BASIC-Videomodus | In Windows-Applikationen als Dateityp einzustellen (Paint) |
---|---|
SCREEN 2, SCREEN 11 | Monochrom-Bitmap (*.bmp, *.dib) |
SCREEN 7, SCREEN 8, SCREEN 9, SCREEN 12 | 16-Farben-Bitmap (*.bmp, *.dib) |
SCREEN 13 | 256-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.
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.
BASIC-Videomodus | Wert für Palettenmodus |
---|---|
SCREEN 1, SCREEN 2, SCREEN 7, SCREEN 8 | PalCGA% |
SCREEN 0, SCREEN 9 | PalEGA% |
SCREEN 11, SCREEN 12, SCREEN 13 | PalVGA% |
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:
Ein Landschaftsfoto und wie es vor und nach der Farbpalettenrundung
aussieht
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.
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.
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!
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.
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.
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.
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
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!
Eine weitere Utility-Prozedur stellt ErzeugeTextGrafik
dar:
Damit kann man einen beliebigen Textbildschirmausschnitt in eine
PUT
-kompatible Grafik umwandeln. Parameter:
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.
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.
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.
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.
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.
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.
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.
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.
Version für QuickBASIC-Compiler herunterladen
Umfang: 57 KB
Version für QuickBASIC-Interpreter herunterladen
Umfang: 18 KB
Version für DJGPP herunterladen
Umfang: 67 KB + Laufzeitumgebung 59 KB