Jup, danke. Du hast recht.
Meine weitere Frage:
Wie kann man in dieser Routine den Drehmittelpunkt verlegen?
Danke.
Gruss
Code ist aus dem Forum hier:
Code: Alles auswählen
UseJPEGImageDecoder()
Procedure RotateIm(ImNr.i, wkl.f)
Dim Vert.POINT(2)
wi.i = ImageWidth(ImNr)
hi.i = ImageHeight(ImNr)
; Vert(0) = linke obere Ecke
; Vert(1) = rechte obere Ecke
; Vert(2) = linke untere Ecke der gedrehten Image berechnen
Vert(0)\x = 0
Vert(0)\y = 0
Vert(1)\x = wi * Cos(wkl)
Vert(1)\y = wi * Sin(wkl)
Vert(2)\x = -1 * hi * Sin(wkl)
Vert(2)\y = hi * Cos(wkl)
; Die nächsten 4 If - Bedingungen dienen nur dazu, das die Ecken des Bildes nicht aus den sichtbaren Bereich herausrutschen
If Vert(1)\x < 0
Vert(0)\x = -1 * Vert(1)\x
Vert(2)\x - Vert(1)\x
Vert(1)\x = 0
EndIf
If Vert(2)\x < 0
Vert(0)\x = -1 * Vert(2)\x
Vert(1)\x - Vert(2)\x
Vert(2)\x = 0
EndIf
If Vert(1)\y < 0
Vert(0)\y = -1 * Vert(1)\y
Vert(2)\y - Vert(1)\y
Vert(1)\y = 0
EndIf
If Vert(2)\y < 0
Vert(0)\y = -1 * Vert(2)\y
Vert(1)\y - Vert(2)\y
Vert(2)\y = 0
EndIf
CreateImage(1, 700, 600)
ihdc = StartDrawing(ImageOutput(1))
shdc = CreateCompatibleDC_(ihdc)
obm.i = SelectObject_(shdc, ImageID(0))
PlgBlt_(ihdc, @Vert(0), shdc, 0, 0, wi, hi, 0, 0, 0)
DeleteDC_(shdc)
StopDrawing()
CopyImage(1, 0)
EndProcedure
OpenWindow(0, 0, 0, 800, 600, "Bild drehen", #WS_OVERLAPPEDWINDOW)
ImageGadget(0, 5, 5, 700, 600, 0, #PB_Image_Border)
ButtonGadget(1, 710, 5, 85, 20, "Laden")
TextGadget(2, 710, 35, 85, 15, "Winkel")
StringGadget(3, 710, 50, 85, 20, "0")
ButtonGadget(4, 710, 75, 85, 20, "Drehen")
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case 1
dn.s = OpenFileRequester("Bild laden", "", "Bitmaps|*.bmp;*.jpg|Alle|*.*", 0)
If dn <> ""
If LoadImage(0, dn)
SetGadgetState(0, ImageID(0))
EndIf
EndIf
Case 4
wkl.f = ValF(GetGadgetText(3))
RotateIm(0, wkl)
SetGadgetState(0, ImageID(0))
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow