Dynamic Image Scaling
Blitz3D Forums/Blitz3D Programming/Dynamic Image Scaling
| ||
| Hey all, I'm trying to create a little app which allows you to position and scale images. Eventually it will be able to save & crop them as well, but I'm stuck on something I was hoping would be simple!!! I can't seem to get the images to scale proportionally at all. Right now I've set up handles on the corners and when you click and drag the corner it works fine to stretch and squash the image, simply using the distance from the opposite corner to the mouse cursor, but I need it to scale proportionally. Any ideas? I've tried a bunch of different math, but nothing has worked like i was hoping it would. The program is built using nSprite for sprites, which allows for pixel perfect precision in 3d. I'll post it if anyone wants to try it. You'll have to supply your own "Test.jpg" for it to run, and you'll have to have nsprite in your decls & as an include.... Include "nsprite.bb"
Graphics3D 640,480,0,2
Global cam = CreateCamera()
PositionEntity cam,0,10,-40
l=CreateLight()
Type img
Field image
Field width#
Field height#
Field x
Field y
Field proportion
Field maskedimage
Field maskwidth
Field maskheight
Field maskx
Field masky
Field scalefactor#
Field scalex#
Field scaley#
Field initwidth
Field initheight
Field currentwidth
Field currentheight
End Type
TFormFilter 1
Global selectedhandle
Global editmode$ = "move"
Global xdist
Global ydist
Global nudgex
Global nudgey
Global scaleing
Global snap = 1
Global showoutlines = 1
Global rightanchor
Global bottomanchor
Global leftanchor
Global topanchor
nS_Initialize()
i.img = New img
i\image = nS_LoadImage("test.jpg")
i\width = nS_ImageWidth(i\image)
i\height = nS_ImageHeight(i\image)
i\initwidth = i\width
i\initheight = i\height
i\proportion = i\width/i\height
i\maskwidth = 100
i\maskheight = 100
i\maskx = 200
i\masky = 200
i\scalefactor = Float(i\maskwidth)/Float(i\width)
nS_ResizeImage i\image,Int(i\width*i\scalefactor),Int(i\height*i\scalefactor)
;i\maskedimage = CreateImage(i\maskwidth,i\maskheight)
selectedhandle = Handle(i)
i\width = nS_ImageWidth(i\image)
i\height = nS_ImageHeight(i\image)
While Not KeyHit(1)
If MouseHit(1)
For i.img = Each img
If MouseX() > i\x-4 And MouseX() < i\x+i\width+4
If MouseY() > i\y-4 And MouseY() < i\y+i\height+4
selectedhandle = Handle(i)
xdist = MouseX() - i\x
ydist = MouseY() - i\y
If MouseX() > i\x-4 And MouseX() < i\x+4 And MouseY() >i\y-4 And MouseY() < i\y+4
scaleing = True
scalecorner = 1
rightanchor = i\x+i\width
bottomanchor = i\y+i\height
i\currentwidth = i\width
i\currentheight = i\height
Else
scaleing = False
EndIf
Else
selectedhandle = 0
EndIf
Else
selectedhandle = 0
EndIf
Next
EndIf
If MouseDown(1)
If scaleing=False
moveimg()
Else
scaleimg(1)
moveimg()
EndIf
EndIf
nudgeimg()
snapimg()
For i.img = Each img
i\scalex = i\width/270
i\scaley = i\height/325
nS_DrawImage(i\image,i\x,i\y)
nS_ResizeImage(i\image,i\scalex,i\scaley,True,False)
Next
UpdateWorld
RenderWorld
;drawoutlines()
drawhandles()
Flip
Wend
End
Function moveimg()
For i.img = Each img
If Handle(i) = selectedhandle
i\x = MouseX()-xdist
i\y = MouseY()-ydist
EndIf
Next
End Function
Function nudgeimg()
nudgex = 0
nudgey = 0
If KeyDown(203)
nudgex = -1
EndIf
If KeyDown(205)
nudgex = 1
EndIf
If KeyDown(208)
nudgey = 1
EndIf
If KeyDown(200)
nudgey = -1
EndIf
If KeyDown(42) Or KeyDown(54)
nudgex = nudgex*6
nudgey = nudgey*6
EndIf
For i.img = Each img
If Handle(i) = selectedhandle
i\x = i\x+nudgex
i\y = i\y+nudgey
EndIf
Next
End Function
Function snapimg()
For i.img = Each img
If Handle(i) = selectedhandle
If snap = 1
If Abs(i\x-i\maskx) <=5
i\x = i\maskx
EndIf
If Abs(i\y-i\masky) <=5
i\y = i\masky
EndIf
If Abs((i\x+i\width)-(i\maskx+i\maskwidth)) <=5
i\x = (i\maskx+i\maskwidth)-i\width
EndIf
If Abs((i\y+i\height)-(i\masky+i\maskheight)) <=5
i\y = (i\masky+i\maskheight)-i\height
EndIf
EndIf
EndIf
Next
End Function
Function scaleimg(corner)
For i.img = Each img
If Handle(i) = selectedhandle
Select corner
Case 1
Color 255,255,0
Rect i\x-4,i\y-4,8,8
i\width = rightanchor-MouseX()
i\height = bottomanchor-MouseY()
Case 2
Case 3
Case 4
End Select
EndIf
Next
End Function
Function drawoutlines()
For i.img = Each img
If Handle(i) = selectedhandle
Color 255,0,0
Rect i\x,i\y,i\width,i\height,0
Color 255,255,0
Rect i\maskx,i\masky,i\maskwidth,i\maskheight,0
EndIf
Next
End Function
Function drawhandles()
For i.img = Each img
If Handle(i) = selectedhandle
Color 0,255,0
Rect i\x-4,i\y-4,8,8
Rect i\x-4,i\y+i\height-4,8,8
Rect i\x+i\width-4,i\y-4,8,8
Rect i\x+i\width-4,i\y+i\height-4,8,8
EndIf
Next
End Function |