 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Stuhli
Anmeldungsdatum: 19.10.2005 Beiträge: 5
|
Verfasst am: 19.10.2005, 17:29 Titel: 256 Graustufen BMP nicht anzeigen, sondern lesen |
|
|
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 |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 19.10.2005, 23:00 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 20.10.2005, 02:03 Titel: |
|
|
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 |
|
 |
Stuhli
Anmeldungsdatum: 19.10.2005 Beiträge: 5
|
Verfasst am: 24.10.2005, 21:49 Titel: |
|
|
Hi, super Beispiel, bin schon um einiges weiter, aber es hängt nochimmer an der Ausgabe. 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 ?  |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 25.10.2005, 08:10 Titel: |
|
|
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 |
|
 |
Stuhli
Anmeldungsdatum: 19.10.2005 Beiträge: 5
|
Verfasst am: 25.10.2005, 09:56 Titel: |
|
|
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 !  |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 25.10.2005, 12:18 Titel: |
|
|
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 |
|
 |
Stuhli
Anmeldungsdatum: 19.10.2005 Beiträge: 5
|
Verfasst am: 25.10.2005, 13:24 Titel: |
|
|
Hallo !
Vielen DANK ! Du scheinst es echt drauf zu haben. Super Erklärung ! Also darauf wäre ich auch gekommen - sagen wir in 10-15 Jahren !
Toll, so eine detailierte Antwort so schnell zu bekommen ist wahnsinn. Werde es heute Abend mal so probieren !
Nochmals 1000 Dank ! |
|
Nach oben |
|
 |
|
|
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.
|
|