Seite 1 von 1

Bild in Array laden?

Verfasst: 18.01.2007 19:45
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

Verfasst: 18.01.2007 23:10
von Fluid Byte
ich will ein bild in eine Array laden ...
Warum bloß? Bild

Verfasst: 18.01.2007 23:59
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.....

Verfasst: 21.01.2007 17:55
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 :?

Verfasst: 21.01.2007 18:00
von edel
hast du oben, mit GetDIBits bekommst du doch den Zeiger
direkt auf das Bild.

Verfasst: 21.01.2007 18:30
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 

Verfasst: 21.01.2007 18:52
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.