Kann PB keine "top-down" Bitmaps?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Kann PB keine "top-down" Bitmaps?

Beitrag von Nero »

Hiho,

ich hab da mal wieder ein kleines Problemchen :oops:
Ich habe die RGB daten eines Video frames und da nen BMP ja nix anderes ist, setze ich darüber einfach
einen bmp Header und kann mit CatchImage nun das bild laden und speichern.

Das funktioniert echt toll nur das mein Bild auf dem Kopf steht. >_<
Laut Wiki sollte es reichen wen man im bmp Header "biHeight" einfach mit einem negativen wert füllt.

Das hab ich auch gleich gemach nur ist das Bild nun nur schwarz.

Liegts an mir oder kann PB einfach keine "top-down" Bitmaps?

Code gibts leider keinen das bild kommt aus ner C lib und der PB Code ist nur das hier

Code: Alles auswählen

  For i = 0 To 50    
    *curFrameData = PBAV_GetNextFrame(myFileId)        
    CatchImage(0, *curFrameData)    
    SaveImage(0, SaveAs + "_"+ Str(i) +".png", #PB_ImagePlugin_PNG)    
    FreeImage(0)
  Next
Wie gesagt mit positiven "biHeight" funktioniert es prima nur steht es auf dem kopf mit negativen bekomme ich nur nen schwarzes Bild

Mfg Nero
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Kann PB keine "top-down" Bitmaps?

Beitrag von Thorium »

Scheint so, musst das Bild halt rummdrehen. Ist ziemlich einfach, musst nur jede Zeile mit CopyMemory umkopieren.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Kann PB keine "top-down" Bitmaps?

Beitrag von edel »

Unter Windows koenntest du es so machen :

Code: Alles auswählen

Procedure Catch_TD_BMP(id, *mem)
	
	Protected offset = 0
	Protected planes = 0
	Protected bperpi = 0
	Protected bitmap = 0
	Protected cx = 0
	Protected cy = 0	
	Protected pbimage = 0
	Protected id_image = 0
	Protected hdc = 0
	
	offset = PeekL(*mem + $A)
	cx = PeekL(*mem + $12)
	cy = PeekL(*mem + $16)
	
	planes = PeekW(*mem + $1A)
	bperpi = PeekW(*mem + $1C)	
	
	bitmap = CreateBitmap_(cx, Abs(cy), planes, bperpi, *mem + offset)
	
	pbimage = CreateImage(id, cx, Abs(cy), bperpi)	
	
	If (id = #PB_Any)
		id_image = pbimage
	Else
		id_image = id
	EndIf
	
	hdc = StartDrawing(ImageOutput(id_image))
		SetDIBitsToDevice_(hdc, 0, 0, cx, Abs(cy), 0, 0, 0, Abs(cy), *mem + offset, *mem + 14, 1)
	StopDrawing()	
	
	ProcedureReturn pbimage
EndProcedure


Procedure Main()
	
	Protected result = 0
	Protected window = 0
	Protected bitmap = 0
	Protected event = 0
	
	window = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 800, 600, "Test")

	bitmap =  Catch_TD_BMP(#PB_Any, ?bild)
	
	Repeat
		event = WaitWindowEvent()
		
		If (event = #PB_Event_Repaint)
			StartDrawing(WindowOutput(window))
			DrawImage(ImageID(bitmap), 0, 0)
			StopDrawing()
		EndIf		
		
	Until (event = #PB_Event_CloseWindow)
	
	ProcedureReturn result
EndProcedure:End Main()
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: Kann PB keine "top-down" Bitmaps?

Beitrag von Nero »

Kann hier leider keine WinAPI befehle verwenden
Habe es wie Thorium gesagt hat einfach im Memory umkopiert.


Mfg Nero
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: Kann PB keine "top-down" Bitmaps?

Beitrag von Nero »

Ah ich depp :coderselixir:

Es geht ja soviel einfacher ich hätte einfach nur gleich :praise:Sprites nehmen sollen.
Einfach mit Drawingbuffer die adresse holen, daten reinkopieren und all meine probleme waren gelöst :lol:

Mfg Nero
Antworten