image - image handle a# - 1,1 element of 2x2 matrix b# - 2,1 element of 2x2 matrix c# - 1,2 element of 2x2 matrix d# - 2,2 element of 2x2 matrix |
Transforms an image based on a 2x2 matrix. The input parameters relate to the elements of the matrix as below: ( a# b# ) ( c# d# ) The image is treated as a matrix and is multiplied by the matrix above. Unless you understand matrix manipulation thoroughly, it is unlikely that you will find this command useful. Common uses for this command might be to rotate or scale images. These are available independently using ScaleImage and RotateImage However, using this command it is possible to do both operations simultaneously. It is also possible to shear images using this command. It is strongly recommended that you run the (rather lengthy) example below to better understand how this command can be used. See also: ScaleImage, RotateImage. |
; Set up the Blitz evironment and user controlled input parameters Global a#=1 ; This controls the horizontal scale, negative values cause the image to flip. Zero is invalid. Global b#=0 ; This shears the image vertically Global c#=0 ; This shears the image horizontally Global d#=1 ; This controls the vertical scale, negative values cause the image to flip. Zero is invalid. Graphics 600,400,16 ; Create an image that we can manipulate Global img=CreateImage(50,50) SetBuffer ImageBuffer(img) Color 255,0,0 : Rect 0,0,25,25,1 Color 255,255,0 : Rect 25,25,25,25,1 Color 0,255,0 : Rect 25,0,25,25,1 Color 0,0,255 : Rect 0,25,25,25,1 ; Set up drawing & timing stuff SetBuffer BackBuffer() timer=CreateTimer(30) Repeat ; deal with keyboard inputs If KeyDown(42) Or KeyDown(54) Then inc#=-0.1 Else inc#=0.1 If KeyDown(30) Then a#=a#+inc# If KeyDown(48) Then b#=b#+inc# If KeyDown(46) Then c#=c#+inc# If KeyDown(32) Then d#=d#+inc# If KeyHit(57) Then RunDemo() If KeyHit(1) Then Exit ; draw the screen DrawScreen() WaitTimer timer Forever End ; Rolling Demo Function RunDemo() degrees=0 ; the number of degrees by which to rotate the image scale#=1.0 ; the scale of the image timer=CreateTimer(10) Repeat a#=scale#:b#=0:c#=0:d#=scale# ; reset the matrix ; increase the degrees (or reset if >360) If degrees<360 Then degrees=degrees+4 Else degrees=0 ; and set up the matrix multipliers. The explanation as to why these work can be found in most good ; mathematics text books, and is too involved to go into here! ma#=Cos(degrees) mb#=Sin(degrees) mc#=-Sin(degrees) md#=Cos(degrees) ; multiply the two matrices. na#=a#*ma#+b#*mc# nb#=a#*mb#+b#*md# nc#=c#*ma#+d#*mc# nd#=c#*mb#+d#*md# a#=na#:b#=nb#:c#=nc#:d#=nd# ; handle input and draw the screen If KeyHit(1) Then Exit If KeyDown(200) And scale#<2.0 Then scale#=scale#+0.1 If KeyDown(208) And scale#>0.1 Then scale#=scale#-0.1 DrawScreen(True) WaitTimer timer Forever a#=1:b#=0:c#=0:d#=1 ; reset the matrix FlushKeys() End Function ; Draw stuff on the screen, including transforming the image Function DrawScreen(demo=False) ClsColor 0,0,0 Cls DrawBlock img,10,10 Text 100,5,"TFORMIMAGE EXAMPLE" Text 100,20,"The command format is: TFormImage image, a, b, c, d" If Not demo Then Text 100,35,"Press 'Space' for a rolling demo" Text 100,50,"Use the keys a, b, c, and d to increase the parameters" Text 100,65,"Also hold down shift to decrease each of these parameters" Else Text 100,35,"Use the up and down arrow keys to change the scale" End If Text 100,80,"Press 'Escape' to exit" Text 10,110,"Current Parameters:" ; ######################## This is where we actually use TFormImage using the input parameters Text 20,125,"TFormImage image, "+a#+", "+b#+", "+c#+", "+d# img2=CopyImage(img) TFormImage img2,a#,b#,c#,d# ; ############################################################################# If demo Then DrawBlock img2,300,280 Else DrawBlock img2,300-ImageWidth(img2)/2,280-ImageHeight(img2)/2 EndIf Flip End Function |