Accord.Imaging.Filters.Blend.CalculateNewImageSize C# (CSharp) Method

CalculateNewImageSize() protected method

Computes the new image size.
protected CalculateNewImageSize ( UnmanagedImage sourceData ) : Size
sourceData Accord.Imaging.UnmanagedImage
return System.Drawing.Size
        protected override Size CalculateNewImageSize(UnmanagedImage sourceData)
        {
            // Calculate source size
            float w = sourceData.Width;
            float h = sourceData.Height;

            // Get the four corners and the center of the image
            PointF[] corners =
            {
                new PointF(0, 0),
                new PointF(w, 0),
                new PointF(0, h),
                new PointF(w, h),
                new PointF(w / 2f, h / 2f)
            };

            // Project those points
            corners = homography.Inverse().TransformPoints(corners);

            // Recalculate image size
            float[] px = { corners[0].X, corners[1].X, corners[2].X, corners[3].X };
            float[] py = { corners[0].Y, corners[1].Y, corners[2].Y, corners[3].Y };

            float maxX = Matrix.Max(px);
            float minX = Matrix.Min(px);
            float newWidth = Math.Max(maxX, overlayImage.Width) - Math.Min(0, minX);

            float maxY = Accord.Math.Matrix.Max(py);
            float minY = Accord.Math.Matrix.Min(py);
            float newHeight = Math.Max(maxY, overlayImage.Height) - Math.Min(0, minY);


            // Store overlay image size
            this.imageSize = new Size((int)Math.Round(maxX - minX), (int)Math.Round(maxY - minY));

            // Store image center
            this.center = Point.Round(corners[4]);

            // Calculate and store image offset
            int offsetX = 0, offsetY = 0;
            if (minX < 0) offsetX = (int)Math.Round(minX);
            if (minY < 0) offsetY = (int)Math.Round(minY);

            this.offset = new Point(offsetX, offsetY);

            if (Double.IsNaN(newWidth) || newWidth == 0)
                newWidth = 1;

            if (Double.IsNaN(newHeight) || newHeight == 0)
                newHeight = 1;

            // Return the final image size
            return new Size((int)Math.Ceiling(newWidth), (int)Math.Ceiling(newHeight));
        }