public void ImageShouldDrawTransformedImage <TPixel>(TestImageProvider <TPixel> provider, PixelBlenderMode mode) where TPixel : struct, IPixel <TPixel> { using (Image <TPixel> image = provider.GetImage()) using (var blend = Image.Load <TPixel>(TestFile.Create(TestImages.Bmp.Car).Bytes)) { Matrix3x2 rotate = Matrix3x2Extensions.CreateRotationDegrees(45F); Matrix3x2 scale = Matrix3x2Extensions.CreateScale(new SizeF(.25F, .25F)); Matrix3x2 matrix = rotate * scale; // Lets center the matrix so we can tell whether any cut-off issues we may have belong to the drawing processor Rectangle srcBounds = blend.Bounds(); Rectangle destBounds = TransformHelpers.GetTransformedBoundingRectangle(srcBounds, matrix); Matrix3x2 centeredMatrix = TransformHelpers.GetCenteredTransformMatrix(srcBounds, destBounds, matrix); // We pass a new rectangle here based on the dest bounds since we've offset the matrix blend.Mutate(x => x.Transform( centeredMatrix, KnownResamplers.Bicubic, new Rectangle(0, 0, destBounds.Width, destBounds.Height))); var position = new Point((image.Width - blend.Width) / 2, (image.Height - blend.Height) / 2); image.Mutate(x => x.DrawImage(blend, mode, .75F, position)); image.DebugSave(provider, new[] { "Transformed" }); } }
/// <inheritdoc/> protected override Size GetTransformedDimensions(Size sourceDimensions, Matrix3x2 matrix) { var sourceRectangle = new Rectangle(0, 0, sourceDimensions.Width, sourceDimensions.Height); if (!Matrix3x2.Invert(this.TransformMatrix, out Matrix3x2 sizeMatrix)) { // TODO: Shouldn't we throw an exception instead? return(sourceDimensions); } return(TransformHelpers.GetTransformedBoundingRectangle(sourceRectangle, sizeMatrix).Size); }
public void Transform_DoesNotCreateEdgeArtifacts <TPixel>(TestImageProvider <TPixel> provider, string resamplerName) where TPixel : struct, IPixel <TPixel> { IResampler resampler = GetResampler(resamplerName); using (Image <TPixel> image = provider.GetImage()) { var rotate = Matrix3x2.CreateRotation((float)Math.PI / 4F, new Vector2(5 / 2F, 5 / 2F)); var translate = Matrix3x2.CreateTranslation((7 - 5) / 2F, (7 - 5) / 2F); Rectangle sourceRectangle = image.Bounds(); Matrix3x2 matrix = rotate * translate; Rectangle destRectangle = TransformHelpers.GetTransformedBoundingRectangle(sourceRectangle, matrix); image.Mutate(c => c.Transform(matrix, resampler, destRectangle)); image.DebugSave(provider, resamplerName); VerifyAllPixelsAreWhiteOrTransparent(image); } }
private static Size GetTransformedDimensions(Size sourceDimensions, Matrix3x2 matrix) { var sourceRectangle = new Rectangle(0, 0, sourceDimensions.Width, sourceDimensions.Height); return(TransformHelpers.GetTransformedBoundingRectangle(sourceRectangle, matrix).Size); }
/// <inheritdoc/> protected override Rectangle GetTransformedBoundingRectangle(Rectangle sourceRectangle, Matrix4x4 matrix) { return(Matrix4x4.Invert(this.TransformMatrix, out Matrix4x4 sizeMatrix) ? TransformHelpers.GetTransformedBoundingRectangle(sourceRectangle, sizeMatrix) : sourceRectangle); }
/// <inheritdoc/> protected override Size GetTransformedDimensions(Size sourceDimensions, Matrix3x2 matrix) { var sourceRectangle = new Rectangle(0, 0, sourceDimensions.Width, sourceDimensions.Height); return(TransformHelpers.GetTransformedBoundingRectangle(sourceRectangle, this.TransformMatrix).Size); }