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:

256 Graustufen BMP nicht anzeigen, sondern lesen

 
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
Stuhli



Anmeldungsdatum: 19.10.2005
Beiträge: 5

BeitragVerfasst am: 19.10.2005, 17:29    Titel: 256 Graustufen BMP nicht anzeigen, sondern lesen Antworten mit Zitat

Hallo, bin neu ! 1 Threat ! Habe auch die Suchfunktion benutzt.

Da sind mehrere Beispiele, die ganz okay sind, aber ich will ja kein BITMAP anzeigen und auf den Bildschirm bringen, sondern nur ein 256 Graustufen Bitmap lesen und in Daten umwandeln - ungefähr so :

Code:

DIM a$(300)
...
dat=0
do
 dat+1
 Read "Bitmap.bmp" ..... irgendwie
  do
  a$(dat)=a$(dat)+str(RGBwert)+";" .......0-255
 UNTIL nächste Zeile
UNTIL DateiEnde
...


So in etwa. Habe es schon für Windows fertiggestellt und super lauffähig, aber nu benötige ich das mal in QBASIC ! Wie kriegt man das hin !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


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

BeitragVerfasst am: 19.10.2005, 23:00    Titel: Antworten mit Zitat

Im Prinzip kannst Du einen BMP-Lader hervornehmen, z.B. meinen unter

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

und diese für Deinen Bedarf umbauen, z.B. im diesem Fall die SUB-Prozedur LadeBild() entsprechend umbauen, z.B. der Code für 1 bpp und 4 bpp rausnehmen und explizit nur noch 8 bpp (=256 Farben) zulassen. Bei der Palette würde ich von einer Graustufenpalette ausgehen (sonst müsstest Du noch eine Paletteleseroutine im Stil von LiesPalette() schreiben, Farben sortieren und Indexwerte umrechnen).

Das Ganze dürfte vermutlich mit einem kleinen Bruchteil des Codes meiner Bibliothek auskommen.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 20.10.2005, 02:03    Titel: Antworten mit Zitat

Hallo

Ich bin nicht ganz sicher ob du das meinst, aber wenn du einfach nur die Farbwerte der Bildpunkte (also nicht die RGB-Werte aus der Palette) lesen willst, könntest du das so machen:

Code:
OPEN "bild.bmp" FOR BINARY AS #1
GET #1, 11, anfang&
GET #1, 19, breite&
GET #1, 23, hoehe&
DIM farbwert(breite& * hoehe& - 1) AS STRING * 1
normbreite = 4 * FIX((breite& + 3) / 4)
FOR x = 0 TO breite& - 1
FOR y = 0 TO hoehe& - 1
z = y + x * hoehe&
GET #1, x + y * normbreite + anfang& + 1, farbwert(z)
NEXT: NEXT
CLOSE #1


Das habe ich aus dem hier angesprochenen BMP-Lader gebastelt.

Zur Erklärung: OPEN...FOR BINARY öffnet Dateien ohne besonderes Format. Zum Einlesen mit GET gibt man zuerst die Nummer des Bytes an, an dem begonnen werden, und die Variable, in die gelsen werden soll. Die Grösse dieser Variablen bestimmt auch, wieviele Bytes gelesen werden. Näheres dazu auch im QB-Kochbuch auf www.qbasic.de unter Dateibearbeitung. Wichtig ist dabei, dass die Numerierung der Bytes in der Datei dabei nicht mit 0 sondern bei 1 beginnt. Der Versuch mit

GET#1, 0, variable

den "nullten" Eintrag der Datei zu lesen, führt zu einer Fehlermeldung.

Im BMP-Header liegt ab dem 10. Byte der Offset der Bilddaten als 32-Bit-Wert. 32-Bit-Variable werden in BASIC durch das angehängte & gekennzeichnet. Genauso werden Breite und Höhe eingelesen. Die Breite wird noch auf das nächstgrössere Vielfache von Vier normiert.

Jeder Farbwert eines Pixels ist bei 256 Farben-bmps logischerweise ein Byte gross. Leider gibt es in BASIC keine 1-Byte-Variablen ausser man macht einen Umweg und definiert eine ein Zeichen lange Textvariable. Dies geschieht in meinem Beispiel mit

DIM farbwert(breite& * hoehe& - 1) AS STRING * 1

Die Bytes werden also in Form von einzelnen ASCII-Zeichen in das Array farbwert eingelesen. Mit

zahl = ASC(farbwert(z))

kannst du aus den Text- wieder "Zahlen"variable machen.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Stuhli



Anmeldungsdatum: 19.10.2005
Beiträge: 5

BeitragVerfasst am: 24.10.2005, 21:49    Titel: Antworten mit Zitat

Hi, super Beispiel, bin schon um einiges weiter, aber es hängt nochimmer an der Ausgabe. traurig Ich benötige doch den RGB wert des Pixels.

Das Programm soll erkennen, daß tatsächlich ein 256 Farben Bild vorliegt (vorallem daß es Graustufen sind ) und dann eben den Grauwert jedes Pixels auslesen. Klar : R + G + B sind gleich, damit wäre es doch einfach oder ??

Ich habe es in Purebasic leicht hinbekommen, aber unter Windows ist es natürlich einfacher.

Mit GET #1, 11 weiß ich wo die Pixel anfangen aber den RGB Wert zeigen mir die Pixeldaten doch nicht oder ? verwundert
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


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

BeitragVerfasst am: 25.10.2005, 08:10    Titel: Antworten mit Zitat

In dem Moment musst Du auch die Paletteneinträge auswerten. Wie das geht, siehe LiesPalette() aus meiner Bibliothek. Diese musst Du auch in einem Array speichern und dann via Farbindex einzelner Pixel darauf zugreifen.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Stuhli



Anmeldungsdatum: 19.10.2005
Beiträge: 5

BeitragVerfasst am: 25.10.2005, 09:56    Titel: Antworten mit Zitat

Wo finde ich diese LIB ?? Hättest Du auch ein Beispiel für das Auslesen ? Ich habe die ganze nacht herumgefummelt und es nicht auf die Reihe bekommen - ich bin zu blöd ! mit dem Kopf durch die Mauer wollen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 25.10.2005, 12:18    Titel: Antworten mit Zitat

Hallo

Bei Bitmaps mit bis zu 256 Farben werden die RGB-Werte in einer Tabelle eingetragen, die Farbwerte der Pixel verweisen auf die Einträge darin. Für jede Farbe wird je ein Byte für den Blau, Grün- und Rotanteil (in dieser Reihenfolge) gespeichert, sowie ein weiteres, unbenutztes Byte, das auf 0 gesetzt ist. Bei 256 Farben sind das also 256*4 = 1024 Byte. Das ist alles auch hier genau beschrieben.

Die Farbtabelle beginnt bei Byte Nummer 54. Auf Byte 28-29 liegt als 16-Bit-Wert die Farbtiefe des Bildes in Bit Das %-Zeichen steht für 16 Bit-Variable, für die RGB-Werte braucht man wieder die ein-Byte Textvariable mit AS STRING*1, jedenfalls finde ich es damit am einfachsten. Dabei wieder beachten, das der Index bei GET mit 1 beginnt und damit alle Adressen eins höher angegeben werden müssen. Hier also ein Beispiel, das prüft, ob es sich um eine 256-Farben .bmp-Datei handelt und die RGB-Werte aus der Palette liest.

Code:
DIM byte AS STRING * 1
DIM rot(255)
DIM gruen(255)
DIM blau(255)
CLS
OPEN "bild.bmp" FOR BINARY AS #1
GET #1, 29, farbtiefe%
IF farbtiefe% <> 8 THEN PRINT "Kein 256 Farben-BMP.": END

FOR farbe = 0 TO 255
 FOR rgb = 0 TO 2
  GET #1, 57 + farbe * 4 - rgb, byte
  IF rgb = 0 THEN rot(farbe) = ASC(byte)
  IF rgb = 1 THEN gruen(farbe) = ASC(byte)
  IF rgb = 2 THEN blau(farbe) = ASC(byte)
 NEXT
NEXT

CLOSE #1

FOR farbe = 0 TO 255
 PRINT USING "####"; rot(farbe);
 PRINT USING "####"; gruen(farbe);
 PRINT USING "####"; blau(farbe)
NEXT

END


Die Ausgabe am Ende ist natürlich blödsinnig, soll auch nur ein Beispiel sein.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Stuhli



Anmeldungsdatum: 19.10.2005
Beiträge: 5

BeitragVerfasst am: 25.10.2005, 13:24    Titel: Antworten mit Zitat

Hallo !

Vielen DANK ! happy Du scheinst es echt drauf zu haben. Super Erklärung ! Also darauf wäre ich auch gekommen - sagen wir in 10-15 Jahren ! zwinkern

Toll, so eine detailierte Antwort so schnell zu bekommen ist wahnsinn. Werde es heute Abend mal so probieren !

Nochmals 1000 Dank !
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