Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

16-Farben .BMPs erstellen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 24.01.2005, 21:30    Titel: 16-Farben .BMPs erstellen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 24.01.2005, 21:35    Titel: Antworten mit Zitat

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. zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 24.01.2005, 22:00    Titel: Antworten mit Zitat

Siehe

http://www.dreael.ch/Deutsch/Download/WindowsBitmapBibliothek.html

Die SUB-Prozedur SpeichereBild() bietet Dir exakt, was Du suchst. Schau Dir dazu das Beispiel unter "Bild abspeichern" genau an.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 25.01.2005, 20:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 25.01.2005, 21:41    Titel: 16-Farben BMP Antworten mit Zitat

@ 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 25.01.2005, 22:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 25.01.2005, 23:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 25.01.2005, 23:57    Titel: Antworten mit Zitat

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 zwinkern
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 26.01.2005, 00:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 26.01.2005, 16:26    Titel: Antworten mit Zitat

Vielen vielen Dank!!

Jetzt klappt das, super!

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz