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:

24 Bit BMPs machen Probleme

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


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 11.09.2005, 22:06    Titel: 24 Bit BMPs machen Probleme Antworten mit Zitat

Hallo.

Ich hab mir auf Basis des Wikipediaartikels zu den Windows Bitmaps einen eigenen BMP Loader für 24Bit BMPs geschrieben. Das funktioniert auch ganz gut. Die Informationen wie Breite usw. werden auch korrekt ausgelesen und das Bild wird maßstabsgetreu dargestellt, doch die Farben sind noch so gaaanz astrein: verlegen


Wie unschwer zu erkennen ist, war das mal ein Windows XP Logo... traurig

Ich verwende natürlich in FreeBasic auch einen 24 Bit Screen. Wer hat eine Idee, was da falsch läuft? Das Bild wird ja komplett angezeigt, nur die Farben sind so shice... Ich lese in der Reihenfolge BLAU, GRÜN, ROT ein wie Wikipedia empfiehlt.

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
d.j.peters
Gast





BeitragVerfasst am: 12.09.2005, 02:18    Titel: Antworten mit Zitat

Hallo Sebastian,
der Fehler ist vermutlich in Zeile 21.

Du meinst bestimmt 32 Bit Farben in FreeBASIC nicht 24.

Grüsse Joshy
Ohne Quellcode kann ich ja nur raten. zwinkern
Nach oben
Devilkevin
aka Kerstin


Anmeldungsdatum: 11.11.2004
Beiträge: 2532
Wohnort: nähe Mannheim

BeitragVerfasst am: 12.09.2005, 14:25    Titel: Antworten mit Zitat

Vielleicht hilft dir ja das weiter:

http://www.freebasic.net/forum/viewtopic.php?t=841
_________________
www.piratenpartei.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 12.09.2005, 17:01    Titel: Antworten mit Zitat

Hallo.

Ich werd den Source aus dem fb.net Forum mal probieren. lächeln Ich meine aber schon 24 Bit Bitmaps.

Wikipedia hat Folgendes geschrieben:
Offset: 14
Datentyp: WORD
Variable: biBitCount

Gibt die Farbtiefe der Bitmap in bpp an; muß einer der folgenden Werte sein: 1, 4, 8, 16, 24 oder 32. Bei 1, 4 und 8 bpp sind die Farben indiziert. 16 und 32 bpp sind ungebräuchlich.


Wikipedia hat Folgendes geschrieben:
24 bpp:
Die Daten jedes Pixels bestehen aus jeweils einem Byte für den Blau-, Grün- und Rot-Kanal (in dieser Reihenfolge!).


Und in MSPAINT kann ich auch nur 24 Bit BMPs und keine 32 Bit BMPs speichern und die oben erwähnte Variable biBitCount ist bei meinen True Color BMPs immer 24 und nicht etwa 32. neutral

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
OdinX



Anmeldungsdatum: 29.07.2005
Beiträge: 253
Wohnort: SG Schweiz

BeitragVerfasst am: 12.09.2005, 17:27    Titel: Antworten mit Zitat

bei mir funktioniert das so:

[code]SUB BildEinfuegen (Pfad AS STRING,Breite AS INTEGER,Hoehe AS INTEGER,X AS INTEGER,Y AS INTEGER)
DIM Bild AS ANY PTR
Bild = IMAGECREATE(Breite,Hoehe)
BLOAD Pfad, Bild
PUT (X,Y), Bild,PSET
IMAGEDESTROY Bild
END SUB[code]

habs mit 24 und 32 ausprobiert und es funzt beides.

vieleicht hilft dir das ja weiter.

mfg OdinX[/code]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 12.09.2005, 19:15    Titel: Antworten mit Zitat

Mmmm, das ist ja klar, dass es mit BLOAD geht (dachtest du, ich kenn mich so schlecht aus?! zwinkern ), aber diese Lösung kann ich in diesem Falle nicht so ganz gut gebrauchen. neutral

Der fb.net Code funzt bei mir leider nicht. Da hat er irgendein Pointerproblem und quittiert die Ausführung mit einer Exception. verwundert
_________________

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
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 12.09.2005, 19:54    Titel: Antworten mit Zitat

wie wärs mal mit code zeigen mit den Augen rollen
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 12.09.2005, 20:09    Titel: Antworten mit Zitat

OK, ich mach gerad die temporären SLEEPs und PRINT Temp% usw. raus... grinsen
_________________

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
d.j.peters
Gast





BeitragVerfasst am: 13.09.2005, 22:32    Titel: Antworten mit Zitat

Hi Sebastian,
wo ist denn nun der Code?
Sebastian hat Folgendes geschrieben:
...Ich meine aber schon 24 Bit Bitmaps..

In FreeBASIC sind Pixel 8,16 oder 32 Bit breit 15, 24 bit werden auch in diesem Format abgebildet.

Du brauchst eigentlich nur an die richtige Stelle (nach dem bmp Header) seeken und dann die BGR Werte von unten nach oben in den screenspeicher einlesen.

Wenn am Anfang der Sreenpointer auf das letze Pixel (unterste Zeile rechts) faslch gesetzt ist (es reicht schon ein Byte) dann hast Du Farbpixel Salat.

Ist bestimmt nur ein minimaler Fehler.
Grüsse Joshy

PS. Der Wert im BMP Header für die Höhe bmp.height kann negativ oder positiv sein.
Nach oben
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 17.09.2005, 17:00    Titel: Antworten mit Zitat

Hi joshy!

Danke für die Antwort. War in den letzten Tagen ein bisschen beschäftigt (QB-Wettbewerb usw.)
Hier der Code: http://fb.exp-soft.de/fbnp/?view=48

Zitat:
Du brauchst eigentlich nur an die richtige Stelle (nach dem bmp Header) seeken und dann die BGR Werte von unten nach oben in den screenspeicher einlesen.

Zitat:
PS. Der Wert im BMP Header für die Höhe bmp.height kann negativ oder positiv sein.

Das weiß ich aus dem Wikipediaartikel schon. Vermutlich berechne ich irgendwo was falsch. neutral

Danke!
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
d.j.peters
Gast





BeitragVerfasst am: 17.09.2005, 17:09    Titel: Antworten mit Zitat

Pobier mal
Code:
SEEK #1, Header.beginOffset + 1

habe es nicht probiert kann aber sein das der offset ab position 0 zählt und seek ab position 1.

Grüsse Joshy
Nach oben
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 17.09.2005, 17:18    Titel: Antworten mit Zitat

Macht keinen wirklichen Unterschied. verwundert
_________________

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
d.j.peters
Gast





BeitragVerfasst am: 17.09.2005, 19:32    Titel: Antworten mit Zitat

Also wenn Du nicht OPTION EXPLICIT verwendest dann kann die Fehlersuche echt nervig sein und es ist schneller den Krämpel mal eben neu zu schreiben.
Habe es unter Linux getestet.

Grüsse Joshy
PS. Ich würde da nicht mit Strings arbeiten wenn es doch nur um BGR Werte geht.
Code:
option explicit
type BMPCOLOR field=1
  b as ubyte
  g as ubyte
  r as ubyte
end type
Type BITMAPINFOHEADER field=1
  biSignatur          as short '"bm"
  biFileSize          as integer
  biDummy             as integer
  biDataoffset        as integer

  biHeaderSize        as integer
  biWidth             as integer
  biHeight            as integer
  biPlanes            as short
  biBitCount          as short
  biCompression       as integer   'BI_...
  biSizeImage         as integer
  biXPelsPerMeter     as integer
  biYPelsPerMeter     as integer
  biClrUsed           as integer
  biClrImportant      as integer
End Type
DIM as BITMAPINFOHEADER BIH
dim as integer hFile
dim as string strFile

strFile="test.bmp"
hFile = FreeFile()
OPEN strFile FOR BINARY ACCESS READ AS #1
if LOF(hfile)=0 then
  CLOSE #hFile
  PRINT "Datei ist leer oder existiert nicht.": SLEEP: end 1
end if

GET #hFile,,BIH
if bih.bisignatur<>&H4d42 then print "Fehler im Dateiformat !!!":close #hFILE:end 1
IF bih.biCompression>0 THEN PRINT "Fehler: BMP ist komprimiert.":close #hFile:end 1
IF bih.biBitCount <> 24 Then PRINT "Fehler: Kein 24Bit BMP...":close #hfile:end 1
with bih
? "FileSize";.biFileSize
? "Reserved";.biDummy
? "DataOffset";.biDataoffset
? "----------------"
? "HeaderSize";.biHeaderSize
? "Width";.biWidth
? "Height";.biHeight
? "Planes";.biPlanes
? "BitCount";.biBitCount
? "Compression";.biCompression
? "ImageSize";.biSizeImage
? "XPels";.biXPelsPerMeter
? "YPels";.biYPelsPerMeter
? "Color used";.biClrUsed
? "Color important";.biClrImportant
? "RestBytes per row";(.biWidth*3) mod 4
end with

seek #hFile,bih.biDataOffset+1
const lastrow = 199
screenres 320,200,32
dim as integer i,numofbytes,x,y
dim as ubyte a
dim as BMPCOLOR Zeile(bih.biWidth-1)
numofbytes = (bih.biWidth*3) mod 4

for y=0 to (abs(bih.biHeight)-1)
  get #hfile,,Zeile()
  for x=0 to (bih.biWidth - 1)
    PSET (x,lastrow-y),rgb(Zeile(x).r,Zeile(x).g,Zeile(x).b)
  next
  if numofbytes>0 then for i=1 to numofbytes:get #hfile,,a:next
NEXT
CLOSE #hfile
SLEEP
END


Zuletzt bearbeitet von d.j.peters am 17.09.2005, 20:26, insgesamt einmal bearbeitet
Nach oben
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 17.09.2005, 20:23    Titel: Antworten mit Zitat

Hallo.

Hmmm, mit dem Source wird mir das Windowslogo bei mir auch nicht richtig angezeigt:


Ich hab aber mal bei meinem Code SCREENRES 640,480,32 statt SCREEN 12,32 verwendet und noch mal ein bisschen mit den SEEKs rumgespielt und da kommt's jetzt richtig raus! happy Der aktualisierte Code ist hier: http://fb.exp-soft.de/fbnp/?view=50

Danke für die guten Tipps! lächeln

Ulkig: Tauscht mal das SCREENRES... gegen SCREEN Irgendwas,32 aus und siehe da: Die Farben sehen ganz seltsam aus! neutral Woran mag das liegen?

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
d.j.peters
Gast





BeitragVerfasst am: 17.09.2005, 20:30    Titel: Antworten mit Zitat

Poste doch mal einen Link auf Deine Bitmap!
Ist die in grau?

Ich habe unter Linux drei getestet mit 24 BitsPerPixel und alle werden richtig angezeigt.

Grüsse Joshy
Nach oben
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 17.09.2005, 20:50    Titel: Antworten mit Zitat

Hier der Link: http://home.arcor.de/ssteiner/qbforum/windows.zip
_________________

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
d.j.peters
Gast





BeitragVerfasst am: 17.09.2005, 20:57    Titel: Antworten mit Zitat

Hier ein Beispiel unter Linux.


Werde mal die Bitmap von Dir runterladen.

Grüsse Joshy
Nach oben
d.j.peters
Gast





BeitragVerfasst am: 17.09.2005, 21:13    Titel: Antworten mit Zitat

Die Bitmap ist 145 pixel breit und die Anzahl der Bytes ist nicht ein Vielfaches von 4 der Übeltäter war.
Code:
numofbytes = (bih.biWidth*3) mod 4

muste so sein.
Code:
numofbytes = 4 - ((bih.biWidth*3) mod 4)


Grüsse Joshy
Nach oben
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 17.09.2005, 21:38    Titel: Antworten mit Zitat

Jo, super! Jetzt klappt der Source wunderbar! lächeln
Ich vermute, dass deiner schneller ist. Dann werd ich den nehmen. Ich schau mal gerad nach.

//edit: Jap, dein Source ist bei meinem Testbild um 0,02s schneller. lächeln Bei größeren Bildern macht das sicher schon was her.
_________________

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
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. 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