Frage deutsch
~~~~~~~~~~~~
Wie kann man den Inhalt des Grafikbildschirms Screen 1 bis 13 auslesen?
Wie lese ich den Inhalt des Grafikbildschirms aus?
Question English
~~~~~~~~~~~~~~
How to read-out the grafic information from screen 1 to 13?
Antwort 1
~~~~~~~~~~~~~~
[ von surfer87 ( surfer87*web.de ) im QB-Forum,
12.7.2003 ]
Diese Methode ist zwar recht langsam, eignet sich aber auch für große
Screens. Man hat ein Bild auf dem Bildschirm und verwendet den folgenden Code,
um den Bildschirminhalt in die Datei bild.koo einzulesen::
SCREEN 13
OPEN "bild.koo" FOR OUTPUT AS #1
FOR y = 0 TO 199
FOR x = 0 TO 319
PRINT #1, POINT(x, y)
NEXT
NEXT
CLOSE #1
und das Wiederanzeigen des eingelesenen Bildschirminhalts geht so::
OPEN "bild.koo" FOR INPUT AS #1
a = 0
b = 0
DO WHILE NOT EOF(1)
INPUT #1, farbe
PSET (a, b), farbe
IF b = 299 AND a = 319 THEN GOTO 40
IF a = 319 THEN : b = b + 1: a = -1
a = a + 1
LOOP
'
40
SLEEP
Wenn man Bilder mit anderer Palette anzeigen möchte, muss man eventuell erst
in der *.koo Datei nachsehen ob die Farbnummer stimmen (z.b. bei
BMP-Bildern).
SORRY FÜR DAS GOTO
*** Anmerkung von FatalError
Wenn Du kein GOTO willst, warum nicht einfach so?:
IF b = 299 AND a = 319 THEN SLEEP: END
*** Anmerkung von Helium vom 13.7.2003
Anbei eine (ungetestete) Lösung:
SCREEN 13
'
defint a-z
'
Sub SnapShot (filename as string)
file = FREEFILE
OPEN filename FOR binary AS file
FOR y = 0 TO 199
FOR x = 0 TO 319
put file, , POINT(x, y)
NEXT
NEXT
CLOSE FILE
end sub
'
Sub LoadSnapshot (filename as string)
file = FREEFILE
dim f as integer
'
OPEN filename FOR binary AS file
do while not EOF(1)
get file, , f
x = x+1
if x > 319 then x=0: y = y+1
Pset (x, y), f
loop
end sub
Kann ja mal einer von euch testen. Ich hab schon ewig nicht mehr QB
programmiert und beim Programmieren ohne Testen schleichen sich immer
irgendwelche kleine Fehler ein. Sollte aber schneller sein als die
Original-Methode und vor allem kleinere Dateien erzeugen.
Aber warum nicht einfach das Bild getten, bsaven und beim laden umgekehrt
BLOADen und dann PUTten. Das sollte noch wesentlich schneller sein.
*** Anmerkung von Breeze vom 13.7.2003
Es geht noch schneller, wenn man den ganzen Bildschirm speichern will. Dann
schreibst Du einfach:
SUB ScreenSave(Dateiname AS STRING)
DEF SEG=&HA000
BSAVE Dateiname, 64000
DEF SEG
END SUB
Un die entsprechend die Lade-Routine zum Wiederherstellen des
Bildschirminhalts sieht so aus::
SUB ScreenLoad(Dateiname AS STRING)
DEF SEG=&HA000
BLOAD Dateiname
DEF SEG
END SUB
Antwort 2
~~~~~~~~~~
Wer die vielen selbstgeschriebenen Programme zum Anzeigen von BMPs kennt,
weiß dass das Anzeigen recht lange dauert! Dabei kann dies Abhilfe
verschaffen:
Ihr lasst euer Bild wie gewohnt unter QBasic anzeigen. Dann gebt ihr in die
letzte Zeile diesen Text ein:
REM BSAVE (Speichern des Bildschirminhaltes)
DEF SEG = &HA000
BSAVE "[Dateiname]", 0, 64000
DEF SEG
Und wenn du den Bildschirm wieder anzeigen lassen willst, dann tippe
folgendes ein:
REM BLOAD(Laden des Bildschirminhaltes)
DEF SEG = &HA000
BLOAD "[Dateiname]", 0
DEF SEG
Antwort 3
~~~~~~~~~
[ von Thomas Antoni, 17.6.2002 ]
Lade von www.qbasic.de das sehr gute Programm
SaveScr.zip ("Save Screen") von Anton Knafl herunter. Du findest es dort in der
Rubrik "QBasic -> Download -> Grafik"
SAVESCR.BAS liest den Inhalt des Grafikbildschirms SCREEN 12 aus und
hinterlegt ihn in 4 Dateien. Das Programm enthält auch eine Lade-Routine, die
den Inhalt aus den gerettenen 4 Dateien ausliest und wieder zur Anzeige
bringt.
Das Programm demonstriert die Verwendung der QBasic Befehle
Grafik-BLOAD/BSAVE. Es lässt sich sehr vielfältig verwenden verwenden, z.B. um
einen neuen Level eines Spiels zu laden oder den Bildschirminhalt von SCREEN 12
vor dem Wechsel zu einem anderen SCREEN-Modus zu retten.
Antwort 4
~~~~~~~~~~
[ von Ch@rly ( karl.pircher*gmx.net ) im QB-Forum,
4.11.2002 ]
Bildschirm speichern in SCREEN 12
Hier eine SUB zum Speichern und Laden des SCREEN 12. Du mußt der SUB den
Namen einer Datei ohne Dateierweiterung übergeben.
' Bildschirminhalt abspeichern
SUB SaveScreen12 (fileSRC AS STRING)
DEF SEG = &HA000
Size& = 38400
OUT &H3CE, 4: OUT &H3CF, 0
BSAVE fileSRC + ".BLU", 0, Size&
OUT &H3CE, 4: OUT &H3CF, 1
BSAVE fileSRC + ".GRN", 0, Size&
OUT &H3CE, 4: OUT &H3CF, 2
BSAVE fileSRC + ".RED", 0, Size&
OUT &H3CE, 4: OUT &H3CF, 3
BSAVE fileSRC + ".INT", 0, Size&
OUT &H3CE, 4: OUT &H3CF, 0
DEF SEG = 0
END SUB
'
'Bildschirminhald laden
SUB LoadScreen12 (fileSRC AS STRING)
DEF SEG = &HA000
OUT &H3C4, 2: OUT &H3C5, 1
BLOAD fileSRC + ".BLU", 0
OUT &H3C4, 2: OUT &H3C5, 2
BLOAD fileSRC + ".GRN", 0
OUT &H3C4, 2: OUT &H3C5, 4
BLOAD fileSRC + ".RED", 0
OUT &H3C4, 2: OUT &H3C5, 8
BLOAD fileSRC + ".INT", 0
OUT &H3C4, 2: OUT &H3C5, 15
DEF SEG = 0
END SUB
Antwort 5
~~~~~~~~
So speichert man den Bildschirm ab.
DEF SEG = &HA000
BSAVE FileName$, 0, 64000
DEF SEG
Um das Ganze rückgänging zu machen, gehst Du so vor:
DEF SEG = &HA000
BLOAD FileName$, 0
DEF SEG
Answer 6
~~~~~~~~~~
[ von www.tek-tips.com , 14.6.2002
]
The fastest way to save a graphic screen to disk using Qbasic
By popular demand, here is your BSAVE and BLOAD programming
example.
'Set the graphics mode...
SCREEN 8 '640 x 200 Resolution
'Set up an array large enough to store the contents of the screen
REDIM GraphBlock(1 TO 31266)
'You determine the required size of the graphics array with:
'Bytes = 4 + INT(((X2-X1+1)*(Bits/pixel/plane)+7)/8)*planes*((Y2-Y1)+1)
'In SCREEN 8 that would be 62532 bytes for an array size of 31266.
'Draw a graphic....
X = 150: Y = 2
DO
CIRCLE (X, Y), Y / 4, (Y / 16) + 1
CIRCLE (X - Y, Y), Y / 4, (Y / 16) + 1
CIRCLE (X + Y, Y), Y / 4, (Y / 16) + 1
IF Y > 200 THEN EXIT DO
X = X + LOG(X * Y) / Y
Y = Y + LOG(Y) / 10
LOOP
'Place the contents of the screen in the array...
GET (0, 0)-(639, 199), GraphBlock
'Set the memory segment to first element of the array
DEF SEG = VARSEG(GraphBlock(1))
BSAVE "Screen.Img", VARPTR(GraphBlock(1)), 62532 'save it to a file
DEF SEG 'Reset the default memory segment to the Qbasic area
CLS 'To show that this actually works, clear the screen...
'and erase the array.
ERASE GraphBlock
PRINT "Press a key to load screen..."
DO WHILE INKEY$ = ""
LOOP
REDIM GraphBlock(1 TO 31266)
DEF SEG = VARSEG(GraphBlock(1))
BLOAD "Screen.Img", VARPTR(GraphBlock(1))
DEF SEG
PUT (0, 0), GraphBlock, PSET
The graphic has returned to the screen. A lot quicker the second time,
eh?
[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]