| 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, 21: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, 01: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, 16: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, 16: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, 18: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, 21: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, 16: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, 16: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, 18: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, 19:26, insgesamt einmal bearbeitet | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		Sebastian Administrator
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
  | 
		
			
				 Verfasst am: 17.09.2005, 19: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, 19: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, 19: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, 20: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 | 
		 | 
	
	
		  | 
	
	
		 |