Richtig Spaß machts natürlich erst, wenn man direkt auf die Bitplanes der Images zugreift. Also nicht erst über Point(x,y,) die Farbe ausliest.
Kaeru, Deine Version spiegelt das Image leider, wenn es sich um ein bottom-up BMP handelt. Ich habe ein Bild mit Schriftzug benutzt und das ist nach dem drehen spiegelverkehrt.
Hier mal ein ein code, der dies beachtet und außerdem sehr schnell ist (1500ms Tompazis Version, 45ms meine Version). Der Speicherverbrauch für das Drehen ist exakt der von 2 Bildern, nicht mehr.
Ich denke, daß ist die schnellste und eleganteste Methode für fixe Bildmanipulation.
Achtung: Der code ist nicht mit der DEMO Version vom PB compilierbar, wegen API Aufrufe.
Code: Alles auswählen
EnableExplicit
Enumeration
#Image_Original
#Image_Gedreht
EndEnumeration
Structure Image
dsBitmap.BITMAP ; Bitmapstruktur des Images
; LONG bmType;
; LONG bmWidth;
; LONG bmHeight;
; LONG bmWidthBytes; ; tatsächliche Breite der Bitplane
; WORD bmPlanes;
; WORD bmBitsPixel; ; Bittiefe der Bitplane
; LPVOID bmBits; ; Zeiger auf den memorybereich
EndStructure
Global Original.Image
Global Gedreht.Image
Define.i OldTime, NewTime
Define.l Ori, Ged, X, Y, Pixel
Oldtime=ElapsedMilliseconds()
LoadImage(#Image_Original,"Test.Bmp") ; MUSS für dieses Beispiel ein 24 Bit bmp-Bild sein!
GetObject_(ImageID(#Image_Original), SizeOf(BITMAP), @Original\dsBitmap)
CreateImage(#Image_Gedreht, Original\dsBitmap\bmHeight, Original\dsBitmap\bmWidth, 24) ; Achtung, die Ausmaße sind hier genau um 90 Grad gedreht, als beim Original!
GetObject_(ImageID(#Image_Gedreht), SizeOf(BITMAP), @Gedreht\dsBitmap)
For Y = 0 To Original\dsBitmap\bmHeight - 1
For X = 0 To Original\dsBitmap\bmWidth - 1
; Hier werden jetzt 3 Byte aus der Bitplanes des Quellimages kopiert (R,G,B) und in die Bitplane des Zielimages geschrieben.
; das Drehen wird durch vertauschen der X und Y Richtungen erreicht.
; Adresse = Beginn der Bilddaten + (X * 3 [1 RGB-Pixel = 24 Bit = 3 Bytes] + Y * Breite des Bildes in Bytes [Hier könnte man auch bmWidth * 3 nehmen]
;Ori = Original\dsBitmap\bmBits + X * 3 + Y * Original\dsBitmap\bmWidthBytes
;Ged = Gedreht\dsBitmap\bmBits + Y * 3 + X * Gedreht\dsBitmap\bmWidthBytes
; Da die obere Formel das Bild leider spiegelverkehrt rechnet (Grund: Quellbild hat eine bottom-up Bitmap [siehe wikipedia]), muss man bei der Transformierung das ganze noch spiegeln.
Ori = Original\dsBitmap\bmBits + X * 3 + Y * Original\dsBitmap\bmWidthBytes
Ged = Ged = Gedreht\dsBitmap\bmBits + Y * 3 + (Gedreht\dsBitmap\bmWidthBytes * Gedreht\dsBitmap\bmHeight - X * Gedreht\dsBitmap\bmWidthBytes)
PokeL(Ged, PeekL(Ori) )
Next X
Next Y
SaveImage(#Image_Gedreht,"DrehTest.bmp")
;
NewTime=ElapsedMilliseconds()-Oldtime
MessageRequester("Info",Str(Newtime)+" ms")
End
Gruß Kurzer