Bild in Array laden?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Artus
Beiträge: 280
Registriert: 15.01.2005 20:53

Bild in Array laden?

Beitrag von Artus »

Hi leute,
ich will ein bild in eine Array laden nach dem ich es mittels Loadimageoder loadsprite funktion geladen habe. ich hab zwar das hier gefunden:

Code: Alles auswählen

Macro Red24( a ) : ((a) & $FF) : EndMacro
Macro Green24( a ) : ((a) >> 8 & $FF ): EndMacro
Macro Blue24( a ) : ((a) >> 16) : EndMacro
bmpInfo.BITMAPINFOHEADER

Dim myRGB.l(BMP_height-1,BMP_width-1) ;/// die x Ebene ist hier die Höhe und die y Ebene die Breite!!

hdc = GetDC_(#Null) ; 24Bit Screen
bmpInfo\biSize = SizeOf(BITMAPINFOHEADER)      ; Set up the bmp header info
bmpInfo\biWidth  = BMP_width
bmpInfo\biHeight = -BMP_height ; // Hier negativer Wert = Flip y axis
bmpInfo\biPlanes = 1
bmpInfo\biBitCount = 32
bmpInfo\biCompression = #BI_RGB

If GetDIBits_(hdc, hbmp, 0, BMP_height, @myRGB(), bmpInfo, #DIB_RGB_COLORS) ;// Bild wird hier in unser Array 'myRGB()' kopiert.

    For x = 0 To BMP_width-1
        For y = 0 To BMP_height-1
            r  = Red24(myRGB(y,x))   : g  = Green24(myRGB(y,x))   : b  = Blue24(myRGB(y,x))
            MachWasMit(r) : MachWasMit(g) : MachWasMit(b)
        Next y
    Next x
EndIf
der hilft mir aber nich weiter da ich auch die anderen formate brauche. geht das irgendwie?

mfg
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

ich will ein bild in eine Array laden ...
Warum bloß? Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

berechtigte frage.

wenn du auf den speicher zugreifen kannst, in dem sich das Bild befindet,
was du musst, um es in ein Array kopieren zu können,
dann kannst du mit pointer-manipulation genauso darauf zugreifen,
als ob es sich bereits in einem Array befindet.

genaugenommen ist ein Bild eine art Array.....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Artus
Beiträge: 280
Registriert: 15.01.2005 20:53

Beitrag von Artus »

mhh also ich will effects auf das bild machen also mit farbveränderung, bumpmapping usw. da währe ne array doch geschickt oder ?! naja kann jemand zeigen wie ich das von dem pointer auslesen kann. neheme ja an das vor den Bilddaten ja noch anderer müll wie palette usw kommen^^ währe nett mfg :?
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

hast du oben, mit GetDIBits bekommst du doch den Zeiger
direkt auf das Bild.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Artus hat geschrieben:mhh also ich will effects auf das bild machen also mit farbveränderung, bumpmapping usw. da währe ne array doch geschickt oder ?! naja kann jemand zeigen wie ich das von dem pointer auslesen kann.

Code: Alles auswählen

Procedure GrayImage(ImageNUM.w)
	Protected bmi.BITMAPINFO
	
	If IsImage(ImageNUM)
		hbmImage = ImageID(ImageNUM) 
		
		IW = ImageWidth(ImageNUM) : IH = ImageHeight(ImageNUM) 
		
		lpBuffer = AllocateMemory(IW * IH * 4) 
		
		bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER) 
		bmi\bmiHeader\biWidth = IW 
		bmi\bmiHeader\biHeight = IH 
		bmi\bmiHeader\biPlanes = 1 
		bmi\bmiHeader\biBitCount = 32
		bmi\bmiHeader\biCompression = #BI_RGB 
		
		hdc = StartDrawing(ImageOutput(ImageNUM)) 

		GetDIBits_(hdc,hbmImage,0,IH,lpBuffer,bmi,#DIB_RGB_COLORS) 
		
		*pxData.LONG = lpBuffer 
		
		For A = 1 To (IW * IH)
			R = Red(*pxData\l) 
			G = Green(*pxData\l) 
			B = Blue(*pxData\l) 
			
			Average =(R + G + B)/3
			
			*pxData\l = RGB(Average,Average,Average) 
			
			*pxData + 4 
		Next
		
		SetDIBits_(hdc,hbmImage,0,IH,lpBuffer,bmi,#DIB_RGB_COLORS)
		StopDrawing() 
		
		ProcedureReturn 1  
	EndIf
EndProcedure

Filename$ = OpenFileRequester("","","Bitmaps (*.bmp)|*.bmp|All Files (*.*)|*.*",0)

If Filename$ 
	LoadImage(0,Filename$)
	
	If IsImage(0)
		GrayImage(0)
	Else
		MessageRequester("Error","Failed to load: " + #CR$ + #CR$ + Filename$ + #CR$ + #CR$ + "Not a valid Bitmap file.",16) : End
	EndIf
Else
	End
EndIf

OpenWindow(0,0,0,500,420,"Bitmap Loader",#WS_OVERLAPPEDWINDOW | 1)

Repeat
    EventID = WaitWindowEvent()
    
    hdcWindow = StartDrawing(WindowOutput(0))    
    DrawImage(ImageID(0),0,0)    
    StopDrawing()    
Until EventID = 16 
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Oder wenn du dich etwas mit dem Bild direkt im Speicher von Windows
beschäftigen möchtest (je nach Modus verschiedene Darstellung im
Speicher, dafür aber direkt), schau mal hier in diesem Thread nach:
http://www.purebasic.fr/german/viewtopi ... ht=plot%2A

Aber GetDiBits_() ist natürlich einfacher.
Antworten