Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
surfer87
Anmeldungsdatum: 16.09.2004 Beiträge: 103
|
Verfasst am: 11.05.2005, 16:08 Titel: BMP Routine (Verständnisprob ;) ) |
|
|
Hi ich habe nach einer simplen Routine zum anzeigen von Bmp Bildern gesucht und auch eine gefunden.
Ich würde trotzdem aber gerne wissen wie diese genau funktioniert damit ich ähnliches auch mal selber proggen kann.
'QB BITMAP READER Copyright (c) 1999 XFlareSoft
DEFINT A-Z
DIM byte AS STRING * 1
P$ = "test.bmp"
SCREEN 13: CLS
OPEN P$ FOR BINARY AS #1
GET #1, 1, ftype: GET #1, 29, bits
IF ftype = 19778 AND bits = 8 THEN
FOR attr = 0 TO 255
OUT &H3C8, attr
FOR rgb = 1 TO 3
GET #1, attr * 4 + 58 - rgb, byte
OUT &H3C9, INT(ASC(byte) * .2471)
NEXT
NEXT
GET #1, 19, xsz: GET #1, 23, ysz
FOR ypl& = 1 TO ysz
IF ypl& > 200 THEN EXIT FOR
FOR xpl& = 1 TO xsz
IF xpl& > 320 THEN EXIT FOR
bpl& = LOF(1) - (ypl& * (3 - (xsz + 3) MOD 4)) - ypl& * xsz + xpl&
GET #1, bpl&, attr
PSET (xpl& - 1, ypl& - 1), attr
NEXT
NEXT
ELSEIF ftype = 19778 THEN
PRINT "You are trying to load a Bit-Map image"
PRINT "which has been saved in"; bits; "bit format."
PRINT "For coding efficiency, this program"
PRINT "only reads 8 bit files. Please save the"
PRINT "image as a 256 color BMP and try again."
ELSEIF LOF(1) = 0 THEN
PRINT "You have specified an invalid file name"
PRINT "to be opened. Please verify that your"
PRINT "P$ variable setting is correct.": del = 1
ELSE
PRINT "You are trying to load a non Bit-Map"
PRINT "file. Check to see if your file name is"
PRINT "correct. "
END IF
CLOSE #1
IF del THEN KILL P$
DO: LOOP WHILE INKEY$ = "": SYSTEM |
|
Nach oben |
|
 |
Jan

Anmeldungsdatum: 04.01.2005 Beiträge: 74
|
Verfasst am: 11.05.2005, 18:43 Titel: |
|
|
Schau dich mal hier um.
http://de.wikipedia.org/wiki/BMP
Da steht genau die Struktur bzw. der Aufbau von .bmp Dateien beschrieben. Kannst dann einfach selber eine programmieren. |
|
Nach oben |
|
 |
surfer87
Anmeldungsdatum: 16.09.2004 Beiträge: 103
|
Verfasst am: 11.05.2005, 19:16 Titel: |
|
|
Naja ein Profi bin ich nicht und ich habe mit solchen Routinen noch nicht viel gearbeitet.
Vllt reichen erstmal Kommentare zu dem Quellcode ist ja nicht zu lang und die meisten kennen sich da gut mit aus. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 11.05.2005, 23:15 Titel: |
|
|
Da sieht man mal wieder warum man Kommentare in die Programme schreiben sollte.
Code: | DEFINT A-Z
DIM byte AS STRING * 1
DIM xsz AS LONG 'x-Size
DIM ysz AS LONG 'y-Size
P$ = "test.bmp"
SCREEN 13
'--- Datei öffnen ---
OPEN P$ FOR BINARY AS #1
'--- Dateiheader auslesen ---
'Die ersten 54 Byte der Datei sind fest vorgegeben und werden Dateiheader genannt
'Position = 1 -> Am Anfang einer BMP-Datei muß die Zahl 19778 stehn
' = 29 -> In diesem Beispiel muß hier eine 8 stehn, da dieses Programm nur bei 8-Bit-BMP-Datein funktioniert
' = 19 -> Bildbreite in Pixel
' = 23 -> Bildhöhe in Pixel
GET #1, 1, ftype
GET #1, 29, bits
GET #1, 19, xsz
GET #1, 23, ysz
'--- 8-Bit-BMP-Datei erkannt ---
IF ftype = 19778 AND bits = 8 THEN
'--- Farbpallette auslesen und setzen ---
FOR attr = 0 TO 255
OUT &H3C8, attr
FOR rgb = 1 TO 3
GET #1, attr * 4 + 58 - rgb, byte
OUT &H3C9, INT(ASC(byte) * .2471)
NEXT
NEXT
'--- Bild zeichnen ---
FOR ypl& = 1 TO ysz
IF ypl& > 200 THEN EXIT FOR
FOR xpl& = 1 TO xsz
IF xpl& > 320 THEN EXIT FOR
bpl& = LOF(1) - (ypl& * (3 - (xsz + 3) MOD 4)) - ypl& * xsz + xpl&
GET #1, bpl&, attr
PSET (xpl& - 1, ypl& - 1), attr
NEXT
NEXT
'--- Fehlermeldung: Keine 8-Bit-BMP-Datei ---
ELSEIF ftype = 19778 THEN
PRINT "You are trying to load a Bit-Map image"
PRINT "which has been saved in"; bits; "bit format."
PRINT "For coding efficiency, this program"
PRINT "only reads 8 bit files. Please save the"
PRINT "image as a 256 color BMP and try again."
'--- Fehlermeldung: Datei nicht vorhanden ---
ELSEIF LOF(1) = 0 THEN
PRINT "You have specified an invalid file name"
PRINT "to be opened. Please verify that your"
PRINT "P$ variable setting is correct."
del = 1 'Datei löschen
'--- Fehlermeldung: Datei ist keine BMP-Datei ---
ELSE
PRINT "You are trying to load a non Bit-Map"
PRINT "file. Check to see if your file name is"
PRINT "correct. "
END IF
'--- Datei schließen ---
CLOSE #1
IF del THEN KILL P$
DO: LOOP WHILE INKEY$ = "": SYSTEM |
|
|
Nach oben |
|
 |
triturus
Anmeldungsdatum: 11.03.2005 Beiträge: 32
|
Verfasst am: 12.05.2005, 01:01 Titel: |
|
|
Hi,
Das Programm funktioniert ja sehr gut. Nur wäre es schön, wenn man auch 24bit-Bilder mit viel besserer Qualität damit ausgeben könnte.
Könnte einer von euch Künstlern sich aus purer Langeweile damit vergnügen, den Quellcode dahin abzuändern? Bei mir funzt das so gar nicht. Dafür weiss ich jetzt, wie Picasso zu seinen Bildern gekommen ist.
mfg
Triti |
|
Nach oben |
|
 |
Mecki Igel

Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
|
Verfasst am: 12.05.2005, 13:39 Titel: |
|
|
24 Bit geht in QB nicht, dazu musst du FreeBASIC oder eine Grafik-Library wie zum Beispiel die AK-Lib benutzen.
In purem QBasic ohne Lib erreichst du mit Screen 12 die höchste Auflösung (640x480, 16c) und in Screen 13 die höchste Farbanzahl (256c, 320x200)
Ansonsten: Einfach die BMP in eine 8-Bit-Bitmap konvertieren - spart eh Speicher.. _________________ » Yodl.de: So sucht man gestern.
» Geld verdienen im Netz + ICQ.
» Firefox!
» 100€ zu gewinnen
» FreeBASIC.de |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 12.05.2005, 20:10 Titel: |
|
|
Eine interessante und reizvolle Aufgabe in QB ist ansonsten die Programmierung einer Dithering-Darstellroutine für TrueColor-.BMP-Dateien auf einem regulären SCREEN-Grafikmodus.
Die C++-Version von
http://www.dreael.ch/Deutsch/Download/WindowsBitmapBibliothek.html
beinhaltet eine solche Routine - ist nicht allzu schwierig, diese auch in QB zu portieren. Tipp: Bei der Farbpalette 216 der 256 Farben auf die Netscape-Farbpalette bei SCREEN 13 setzen und entsprechend mit
Code: | PSET (x%, y%), basis% + (r% \ 51) + 6 * (g% \ 51%) + 36 * (b% \51) |
berechnen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
triturus
Anmeldungsdatum: 11.03.2005 Beiträge: 32
|
Verfasst am: 12.05.2005, 23:52 Titel: |
|
|
Danke fürs Beauskunften.
Soso, 24 Bit geht nicht. Übel. Na ja, werde mal Dreaels Link folgen.
Habe hier nämlich ein Bild von einem Eichhörnchen, das unter 24 Bit gar prächtig aussieht, bei 8 Bit aber so, als wäre es bereits von einem Marder verdaut worden. Das Tierchen muß aber in freundlicher Gestalt auf den Bildschirm, sonst höhnt die ganze Schule.
Triti |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 13.05.2005, 20:27 Titel: |
|
|
Wie in meinen verschiedenen Artikeln beschrieben, lasse ich in der Regel Corel PhotoPAINT ans Werk, um ein Bild so richtig für die regulären SCREEN-Bildschirmmodi optimieren zu können. Übrigens eignet sich ein Programm, bei dem man eine Bitmap auch auf eine selber definierte Farbpalette runterrechnen kann, am besten. Genau dies machte ich seinerzeit bei
http://beilagen.dreael.ch/QB/GELDUHR.ZIP
deswegen kommen auch die Banknoten farblich im ganz normalen SCREEN 12-Modus auch so gut heraus. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 14.05.2005, 00:46 Titel: |
|
|
Mecki hat Folgendes geschrieben: | 24 Bit geht in QB nicht, dazu musst du FreeBASIC oder eine Grafik-Library wie zum Beispiel die AK-Lib benutzen.
In purem QBasic ohne Lib erreichst du mit Screen 12 die höchste Auflösung (640x480, 16c) und in Screen 13 die höchste Farbanzahl (256c, 320x200)
Ansonsten: Einfach die BMP in eine 8-Bit-Bitmap konvertieren - spart eh Speicher.. |
HI.
Ich hab mir vor längerem die library gezogen, doch diese klappt leider bei mir nicht. Ich hab die datei eingebunden (C:\qbasic\qb.exe /ak14b.qlb oder so ähnlich. Kann jetzt nicht nachgucken, habs aber richtig) doch wenn ich eine sub aufrufe (z.B.Auflösung auf 1024*768 setzen xscrenn &H irgendwas ) dann geht der Bildschirm aus. Nur die modi von qbasic werden unterstützt. Monitor kann aber auch viel höhere auflösungen anzeigen. Unter windows hab ich den auf 1024*768 stehen. Bildwiederholfrequenz auf 85. Muss ich da was ändern oder wieso klappt das nicht???
PLEASE HELP
mfg
Michael _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Kai Bareis

Anmeldungsdatum: 10.09.2004 Beiträge: 545 Wohnort: Baden Würtemberg
|
Verfasst am: 14.05.2005, 00:57 Titel: |
|
|
Hallo
also wen du die AKlib 14b hast dann kann es sein das du blos bis 256 Farben gehen kannst. Und nach Xscreen dauert es immer etwas bis die Initialisirung oder was auch immer fertig ist. Wen ich mich nicht irre kannst du von AKs Seite http://www.iconsoft.de die Version AK 15 runterladen _________________ MfG Kai Bareis
Es ist noch kein Meister vom Himmel gefallen! Warum einfach wens auch umständlich geht! |
|
Nach oben |
|
 |
|