Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 24.01.2005, 21:30 Titel: 16-Farben .BMPs erstellen |
|
|
Hallo Leute!
Ich habe einen SpaceShooter unter Screen 7 programmiert
(wem das jetzt bekannt vorkommt, das hab' ich schonmal hier im Forum geschrieben)
und möchte die Möglichkeit, Screenshots zu machen, einbauen. Allerdings nicht mit BSAVE/BLOAD.
Ich möchte eine 16-Farben Bitmap-Datei erstellen
(Wohlgemerkt: im SCREEN 7), damit der User sich den Screenshot unter Windows angucken kann.
Gibt er irgendwo schon eine fertige Routine, oder hat jemand den Code?
Wie sind überhaupt 16-Farben BMPs aufgebaut?
Schon mal vielen Dank,
jb |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 24.01.2005, 21:35 Titel: |
|
|
Hallo.
Bei Wikipedia findest du die Formatspezifikationen, wenn du alles von Hand machen möchtest.
Mit der AK-Lib kannst du aber ganz einfach bestimmte Bildschirmbereiche oder auch den ganzen Bildschirm als BMP abspeichern. Funktioniert prima; kann ich nur empfehlen.
BMP-Schreibroutinen gibt es aber auch noch viele andere: Dreaels Bitmap-Bibliothek und auf vielen QB-Seiten findest du noch andere.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 25.01.2005, 20:51 Titel: |
|
|
also ich hab mal eine Routine programmiert die das in Screen 12 kann (4-Bit / 16 Farben) BMP speichern.
Möglicherweise kannst du diese Routine modifizieren:
http://www.east-power-soft.de/download/scrshot.zip _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 25.01.2005, 21:41 Titel: 16-Farben BMP |
|
|
@ E-P-S:
Danke, die Routine ist klasse (unter SCREEN 12)!!
Aber unter
SCREEN 7, , 0, 1
läuft sie nicht.
Habe jetzt alles in eine Sub gepackt, und x- und y-Maximalwerte an SCREEN 7 angepasst.
Das Programm läuft fehlerlos, aber das Bild kann unter Windows nicht angezeigt werden.
Hier der Code:
Code: |
SUB ScreenShot (FileName$)
DIM ScrShotPAL(15, 2)
FOR scr = 0 TO 15
OUT &H3C7, scr
ScrShotPAL(scr, 2) = CINT(INP(&H3C9) * 4.04)
ScrShotPAL(scr, 1) = CINT(INP(&H3C9) * 4.04)
ScrShotPAL(scr, 0) = CINT(INP(&H3C9) * 4.04)
NEXT
ScrHead$ = ""
ScrHead$ = ScrHead$ + "424D7658020000000000760000002800"
ScrHead$ = ScrHead$ + "000080020000E0010000010004000000"
ScrHead$ = ScrHead$ + "000000580200120B0000120B00001000"
ScrHead$ = ScrHead$ + "000010000000"
ch = FREEFILE
OPEN FileName$ FOR OUTPUT AS #ch
FOR scr = 1 TO LEN(ScrHead$) STEP 2
PRINT #ch, CHR$(VAL("&H" + MID$(ScrHead$, scr, 2)));
NEXT
FOR scr = 0 TO 15
PRINT #ch, CHR$(ScrShotPAL(scr, 0));
PRINT #ch, CHR$(ScrShotPAL(scr, 1));
PRINT #ch, CHR$(ScrShotPAL(scr, 2));
PRINT #ch, CHR$(0);
NEXT
ScrY% = 199
DO WHILE ScrY% > -1
ScrX% = 0: ScrLine$ = ""
DO WHILE ScrX% < 320
ScrLeft% = POINT(ScrX%, ScrY%)
ScrRight% = POINT(ScrX% + 1, ScrY%)
ScrLine$ = ScrLine$ + CHR$(VAL("&H" + HEX$(ScrLeft%) + HEX$(ScrRight%)))
ScrX% = ScrX% + 2
LOOP
PRINT #ch, ScrLine$;
ScrY% = ScrY% - 1
LOOP
CLOSE #ch
|
Könnte es am Dateiheader liegen??
(der ist ja bestimmt für SCREEN 12)
So viel Ahnung habe ich dann doch wieder nicht.
Trotzdem schon mal Danke!
jb |
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 25.01.2005, 22:49 Titel: |
|
|
ja...das könnte in der Tat sein, da die Bildgröße nicht mehr stimmt und folglich nicht genügend Daten in der Datei stehen. Probiers mal mit dem Header hier:
ScrHead$ = ""
ScrHead$ = ScrHead$ + "424D767D000000000000760000002800"
ScrHead$ = ScrHead$ + "000040010000C8000000010004000000"
ScrHead$ = ScrHead$ + "0000007D0000130B0000130B00001000"
ScrHead$ = ScrHead$ + "000010000000"
hab's nicht getestet, sollte aber gehen. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 25.01.2005, 23:31 Titel: |
|
|
Zum Thema Header: Microsoft hat das .BMP-Format übrigens offiziell dokumentiert. Wer sucht (in MSDN), der findet:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_2w1f.asp
=> Ich würde da schon im Idealfall mit TYPE entsprechende Strukturen bilden, die man mit GET/PUT ablegen kann.
Benötigt werden übrigens folgende Einträge: BITMAPFILEHEADER (kommt zuerst in der Datei), BITMAPINFOHEADER (folgt unmittelbar danach) und RGBQUAD (einzelner Farbpaletteneintrag; davon gibt es genau 16 Stück in diesem Fall)
Nur schon so etwas wie
Code: | kennung$ = "BM"
groesse& = ...
reserviert1% = 0
reserviert2% = 0
offset& = ...
bitmapfileheader$ = kennung$ + MKL$(groesse&) + MKI$(reserviert1%) + MKI$(reserviert2%) + MKL$(offset&) |
ist viel übersichtlicher. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 25.01.2005, 23:57 Titel: |
|
|
stimmt ... und ist auch viel umständlicher ... hier wird doch immer wieder die gleiche BMP erzeugt, ausser den Farbwerten - und selbst die nur eventuell - ändert sich doch nie was. Also warum zum Henker 10 Seiten Microsoft gedudel durchlesen um EINE bmp zu erzeugen?
Wenn es ein BMP Reader währe - ok, aber so finde ich das auf gutschwitzerisch - Käse _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 26.01.2005, 00:09 Titel: |
|
|
Für die Interessierten noch ein kleiner Ausschnitt aus BMP_LIB.BAS zitiert:
Code: | PPEN dn$ + ".BMP" FOR OUTPUT AS 1
' BITMAPFILEHEADER schreiben
PRINT #1, "BM"; MKL$(GesGroe&); MKI$(0); MKI$(0); MKL$(BitmAbst&);
' BITMAPINFOHEADER schreiben
PRINT #1, MKL$(40&); MKL$(xb&); MKL$(yb&); MKI$(1); MKI$(bpp%); MKL$(0&);
PRINT #1, MKL$(BildGroe&); MKL$(dpm&); MKL$(dpm&); MKL$(0&); MKL$(0&); |
Die variablen Werte werden unmittelbar vorher berechnet:
Code: | SUB SpeichereBild (dn$, f#(), indf%, p&(), indp%, bpp%, mo%)
CONST dpm& = 60& * 5000& \ 127& ' Dichte: 60 dpi = 2362 Pixel/Meter
aFa% = 1
FOR i% = 1 TO bpp%
aFa% = aFa% * 2
NEXT i%
BitmAbst& = CLNG(14 + 40 + 4 * aFa%)
pu1$ = MKD$(f#(indf%))
IF bpp% = 8 THEN
xb& = CLNG(CVI(LEFT$(pu1$, 2)) \ 8)
ELSE
xb& = CLNG(CVI(LEFT$(pu1$, 2)))
END IF
yb& = CLNG(CVI(MID$(pu1$, 3, 2)))
' Zeilenlänge in der Datei
ZeiLaenge& = (xb& * CLNG(bpp%) + 31& AND -32&) \ 8&
BildGroe& = yb& * ZeiLaenge&
GesGroe& = BildGroe& + BitmAbst& |
@jb: Viele dieser Formel geben Dir wichtige Details zum Aufbau einer .BMP-Datei bekannt! _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
jb
Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 26.01.2005, 16:26 Titel: |
|
|
Vielen vielen Dank!!
Jetzt klappt das, super!
jb |
|
Nach oben |
|
|
|