void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs e) { SKImageInfo info = e.Info; SKCanvas canvas = e.Surface.Canvas; canvas.Clear(); if (image != null) { if (kernelSelected) { using (SKPaint paint = new SKPaint()) { paint.FilterQuality = SKFilterQuality.High; paint.IsAntialias = false; paint.IsDither = false; paint.ImageFilter = SKImageFilter.CreateMatrixConvolution( sizeI, kernel, 1f, 0f, new SKPointI(1, 1), SKMatrixConvolutionTileMode.Clamp, false); canvas.DrawImage(image, info.Rect, ImageStretch.Uniform, paint: paint); image = e.Surface.Snapshot(); kernel = null; kernelSelected = false; } } else { canvas.DrawImage(image, info.Rect, ImageStretch.Uniform); } } }
[Arguments("t.jpg", "t2.jpg")] // SkiaSharp doesn't have TIFF support public void SkiaSharp(string input, string output) { using (var bitmap = SKBitmap.Decode(input)) { bitmap.ExtractSubset(bitmap, SKRectI.Create(100, 100, bitmap.Width - 200, bitmap.Height - 200)); var targetWidth = (int)Math.Round(bitmap.Width * .9F); var targetHeight = (int)Math.Round(bitmap.Height * .9F); // bitmap.Resize(new SKImageInfo(targetWidth, targetHeight), SKBitmapResizeMethod.Triangle) // is deprecated, so we use `SKFilterQuality.Low` instead, see: // https://github.com/mono/SkiaSharp/blob/1527bf392ebc7b4b57c992ef8bfe14c9899f76a3/binding/Binding/SKBitmap.cs#L24 using (var resized = bitmap.Resize(new SKImageInfo(targetWidth, targetHeight), SKFilterQuality.Low)) { using (var surface = SKSurface.Create(new SKImageInfo(targetWidth, targetHeight, bitmap.ColorType, bitmap.AlphaType))) using (var canvas = surface.Canvas) using (var paint = new SKPaint { FilterQuality = SKFilterQuality.High }) { var kernel = new[] { -1f, -1f, -1f, -1f, 16f, -1f, -1f, -1f, -1f }; var kernelSize = new SKSizeI(3, 3); var kernelOffset = new SKPointI(1, 1); paint.ImageFilter = SKImageFilter.CreateMatrixConvolution(kernelSize, kernel, 0.125f, 0f, kernelOffset, SKMatrixConvolutionTileMode.Repeat, false); canvas.DrawBitmap(resized, 0, 0, paint); canvas.Flush(); using (var fileStream = File.OpenWrite(output)) { surface.Snapshot() .Encode(SKEncodedImageFormat.Jpeg, Quality) .SaveTo(fileStream); } } } } }