Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 11.09.2005, 22:06 Titel: 24 Bit BMPs machen Probleme |
|
|
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:
Wie unschwer zu erkennen ist, war das mal ein Windows XP Logo...
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 |
|
|
d.j.peters Gast
|
Verfasst am: 12.09.2005, 02:18 Titel: |
|
|
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. |
|
Nach oben |
|
|
Devilkevin aka Kerstin
Anmeldungsdatum: 11.11.2004 Beiträge: 2532 Wohnort: nähe Mannheim
|
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 12.09.2005, 17:01 Titel: |
|
|
Hallo.
Ich werd den Source aus dem fb.net Forum mal probieren. 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.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
OdinX
Anmeldungsdatum: 29.07.2005 Beiträge: 253 Wohnort: SG Schweiz
|
Verfasst am: 12.09.2005, 17:27 Titel: |
|
|
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 |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 12.09.2005, 19:54 Titel: |
|
|
wie wärs mal mit code zeigen _________________ "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 |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
d.j.peters Gast
|
Verfasst am: 13.09.2005, 22:32 Titel: |
|
|
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
|
Verfasst am: 17.09.2005, 17:00 Titel: |
|
|
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.
Danke!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
d.j.peters Gast
|
Verfasst am: 17.09.2005, 17:09 Titel: |
|
|
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
|
|
Nach oben |
|
|
d.j.peters Gast
|
Verfasst am: 17.09.2005, 19:32 Titel: |
|
|
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
|
Verfasst am: 17.09.2005, 20:23 Titel: |
|
|
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! Der aktualisierte Code ist hier: http://fb.exp-soft.de/fbnp/?view=50
Danke für die guten Tipps!
Ulkig: Tauscht mal das SCREENRES... gegen SCREEN Irgendwas,32 aus und siehe da: Die Farben sehen ganz seltsam aus! 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 |
|
|
d.j.peters Gast
|
Verfasst am: 17.09.2005, 20:30 Titel: |
|
|
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
|
|
Nach oben |
|
|
d.j.peters Gast
|
Verfasst am: 17.09.2005, 20:57 Titel: |
|
|
Hier ein Beispiel unter Linux.
Werde mal die Bitmap von Dir runterladen.
Grüsse Joshy |
|
Nach oben |
|
|
d.j.peters Gast
|
Verfasst am: 17.09.2005, 21:13 Titel: |
|
|
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
|
|
Nach oben |
|
|
|