This code can be used to manipulate an image into any space defined by four corners. Unlike an affine-transform (3 point transformation) which uses a parallelogram shaped space, this 4 point transformation can use absolutely any generic shape that can be defined by four points. Below is this code, split into the two files that I ended up using.

Code for DPointType.bas

Code for FourPointTransform.clsCode:Public Type DPOINT X As Double Y As Double End Type

Use the above class to transform an image in one picture box into a random shape in a second picture box, using the sample code below:Code:'Requires DPointType.bas 'The Points array holds 4 points. Below is an explanation of each point. 'Points(0) is the position that a rectangle's upper left point is mapped to. 'Points(1) is the position that a rectangle's upper right point is mapped to. 'Points(2) is the position that a rectangle's lower left point is mapped to. 'Points(3) is the position that a rectangle's lower right point is mapped to. Friend Function X2(ByVal X As Double, ByVal Y As Double, ByVal ImgWidth As Double, ByVal ImgHeight As Double, _ ByRef Points() As DPOINT) As Double Dim a As Double Dim b As Double Dim c As Double Dim d As Double b = (Points(1).X - Points(0).X) / (ImgWidth - 1) d = Points(0).X c = (Points(2).X - Points(0).X) / (ImgHeight - 1) a = (Points(3).X - (ImgHeight - 1) * c - d - (ImgWidth - 1) * b) / ((ImgWidth - 1) * (ImgHeight - 1)) X2 = X * (Y * a + b) + Y * c + d End Function Friend Function Y2(ByVal X As Double, ByVal Y As Double, ByVal ImgWidth As Double, ByVal ImgHeight As Double, _ ByRef Points() As DPOINT) As Double Dim a As Double Dim b As Double Dim c As Double Dim d As Double b = (Points(2).Y - Points(0).Y) / (ImgHeight - 1) d = Points(0).Y c = (Points(1).Y - Points(0).Y) / (ImgWidth - 1) a = (Points(3).Y - (ImgHeight - 1) * b - (ImgWidth - 1) * c - d) / ((ImgHeight - 1) * (ImgWidth - 1)) Y2 = Y * (X * a + b) + X * c + d End Function

Or use the above class to transform a portion of an image defined by any random 4-point shape in one picture box to fit correctly into a second picture box. This is the inverse of the above transformation. The code is very similar to the above, with just a few changes. See the code belowCode:Private Sub TransformImage() dim Xfrm as new FourPointTransform dim Points(3) as DPOINT Points(0).X=100 : Points(0).Y=20 Points(1).X=300 : Points(1).Y=45 Points(2).X=115 : Points(2).Y=200 Points(3).X=290 : Points(3).Y=230 for y = 0 to Picture1.Height-1 for x = 0 to Picture1.Width-1 u = Xfrm.X2(X, Y, Picture1.Width, Picture1.Height, Points) v = Xfrm.Y2(X, Y, Picture1.Width, Picture1.Height, Points) Picture2.pset(u,v),Picture1.point(x,y) next x next y End Sub

Code:Private Sub InverseTransformImage() dim Xfrm as new FourPointTransform dim Points(3) as DPOINT Points(0).X=100 : Points(0).Y=20 Points(1).X=300 : Points(1).Y=45 Points(2).X=115 : Points(2).Y=200 Points(3).X=290 : Points(3).Y=230 for y = 0 to Picture2.Height-1 for x = 0 to Picture2.Width-1 u = Xfrm.X2(X, Y, Picture2.Width, Picture2.Height, Points) v = Xfrm.Y2(X, Y, Picture2.Width, Picture2.Height, Points) Picture2.pset(x,y),Picture1.point(u,v) next x next y End Sub