private static SKBitmap ZoomAndRotate(SKBitmap originalBitmap, float aspectRatio, int zoom, bool isRotated, float rotation, bool isKeystoned, float keystone) { var rotatedAndZoomed = new SKBitmap(originalBitmap.Width, originalBitmap.Height); using (var tempCanvas = new SKCanvas(rotatedAndZoomed)) { var rightVerticalZoom = aspectRatio * zoom; var zoomedX = zoom / -2f; var zoomedY = rightVerticalZoom / -2f; var zoomedWidth = originalBitmap.Width + zoom; var zoomedHeight = originalBitmap.Height + rightVerticalZoom; if (isRotated) { tempCanvas.RotateDegrees(rotation, originalBitmap.Width / 2f, originalBitmap.Height / 2f); } tempCanvas.DrawBitmap( originalBitmap, SKRect.Create( 0, 0, originalBitmap.Width, originalBitmap.Height), SKRect.Create( zoomedX, zoomedY, zoomedWidth, zoomedHeight )); if (isRotated) { tempCanvas.RotateDegrees(rotation, -1 * originalBitmap.Width / 2f, originalBitmap.Height / 2f); } } SKBitmap keystoned = null; if (isKeystoned) { keystoned = new SKBitmap(originalBitmap.Width, originalBitmap.Height); using (var tempCanvas = new SKCanvas(keystoned)) { tempCanvas.SetMatrix(TaperTransform.Make(new SKSize(originalBitmap.Width, originalBitmap.Height), keystone > 0 ? TaperSide.Left : TaperSide.Right, TaperCorner.Both, 1 - Math.Abs(keystone))); tempCanvas.DrawBitmap(rotatedAndZoomed, 0, 0); rotatedAndZoomed.Dispose(); } } return(keystoned ?? rotatedAndZoomed); }
private static SKBitmap ZoomAndRotate(SKBitmap originalBitmap, double zoom, bool isRotated, float rotation, bool isKeystoned, float keystone) { var rotatedAndZoomed = new SKBitmap(originalBitmap.Width, originalBitmap.Height); using (var tempCanvas = new SKCanvas(rotatedAndZoomed)) { var zoomedX = originalBitmap.Width * zoom / -2f; var zoomedY = originalBitmap.Height * zoom / -2f; var zoomedWidth = originalBitmap.Width * (1 + zoom); var zoomedHeight = originalBitmap.Height * (1 + zoom); if (isRotated) { tempCanvas.RotateDegrees(rotation, originalBitmap.Width / 2f, originalBitmap.Height / 2f); } tempCanvas.DrawBitmap( originalBitmap, SKRect.Create( (float)zoomedX, (float)zoomedY, (float)zoomedWidth, (float)zoomedHeight )); // blows up the bitmap, which is cut off later if (isRotated) { tempCanvas.RotateDegrees(rotation, -1 * originalBitmap.Width / 2f, originalBitmap.Height / 2f); } } SKBitmap keystoned = null; if (isKeystoned) { keystoned = new SKBitmap(originalBitmap.Width, originalBitmap.Height); using (var tempCanvas = new SKCanvas(keystoned)) { tempCanvas.SetMatrix(TaperTransform.Make(new SKSize(originalBitmap.Width, originalBitmap.Height), keystone > 0 ? TaperSide.Left : TaperSide.Right, TaperCorner.Both, 1 - Math.Abs(keystone))); tempCanvas.DrawBitmap(rotatedAndZoomed, 0, 0); rotatedAndZoomed.Dispose(); } } return(keystoned ?? rotatedAndZoomed); }