Ich weis, urururalter Thread, aber ich hab die erste Version etwas erweitert.
Sie arbeitet jetzt mit #pb_any (und ist damit überall ohne Konflikte nutzbar),
es kann ein Qualitätsfaktor (aa) angegeben werden (es wird dann mit aa facher Auflösung gedreht und dann verkleinert. Das glättet die harten Kanten, mit 2 siehts schon deutlich schöner aus),
man kann eine Hintergrundfarbe setzen,
die Imagegröße des rotierten Bildes wird korrekt berechnet,
statt Floats werden Double verwendet
UND enableExplicit-Tauglich.
viel Spaß
Code: Alles auswählen
EnableExplicit
UseJPEGImageDecoder()
Procedure RotateIm(ImNr.i, wkl.d,aa=2,back=#Black)
Protected imTemp,wi,hi,cos.d,sin.d,i,a,x,y,newwidth,newhight,ihdc,shdc
Dim Vert.POINT(3)
wi = ImageWidth(ImNr)
hi = ImageHeight(ImNr)
cos=Cos(wkl)
sin=Sin(wkl)
; Vert(0) = linke obere Ecke
; Vert(1) = rechte obere Ecke
; Vert(2) = linke untere Ecke der gedrehten Image berechnen
; 3ter ist eigentlich nicht nötig, aber praktisch für die neue größe zu berechnen
vert(1)\x= (wi*cos) - (0*sin)
vert(1)\y= (wi*sin) + (0*cos)
vert(2)\x= (0*cos) - (hi*sin)
vert(2)\y= (0*sin) + (hi*cos)
vert(3)\x= (wi*cos) - (hi*sin)
vert(3)\y= (wi*sin) + (hi*cos)
;test
For i=0 To 3
vert(i)\x*aa
vert(i)\y*aa
Next
;aus den Null drehen
For i=0 To 3
If vert(i)\x<0
x=vert(i)\x
For a=0 To 3
vert(a)\x-x
Next
EndIf
If vert(i)\y<0
y=vert(i)\y
For a=0 To 3
vert(a)\y-y
Next
EndIf
Next
;neue größe berechnen
newwidth=0
newhight=0
For i=0 To 3
Debug ""+i+":"+vert(i)\x+" "+vert(i)\y
If vert(i)\x>newwidth
newwidth=vert(i)\x
EndIf
If vert(i)\y>newhight
newhight=vert(i)\y
EndIf
Next
newwidth+1
newhight+1
imTemp=CreateImage(#PB_Any, newwidth, newhight)
ihdc = StartDrawing(ImageOutput(imTemp))
Box(0,0,newwidth,newhight,back)
shdc = CreateCompatibleDC_(ihdc)
SelectObject_(shdc, ImageID(imnr))
PlgBlt_(ihdc, @Vert(0), shdc, 0, 0, wi, hi, 0, 0, 0)
DeleteDC_(shdc)
StopDrawing()
ResizeImage(imtemp,newwidth/aa, newhight/aa,#PB_Image_Smooth)
;CopyImage(imTemp, imnr)
ResizeImage(imnr,newwidth/aa,newhight/aa)
StartDrawing(ImageOutput(imnr))
DrawImage(ImageID(imtemp),0,0)
StopDrawing()
FreeImage(imTemp)
ProcedureReturn ImageID(imnr)
FreeImage(imTemp)
EndProcedure
Define event,wkl.d,dn.s
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 (Radiant)")
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 = Radian(ValD(GetGadgetText(3)))
RotateIm(0, wkl,2,#Green)
SetGadgetState(0, ImageID(0))
ResizeGadget(0,5,5,ImageWidth(0),ImageHeight(0))
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow