示例#1
0
        public void TestMaui()
        {
            using (var skBmp = new SkiaSharp.SKBitmap(256, 256, false))
            {
                using (var skCanvas = new SkiaSharp.SKCanvas(skBmp))
                {
                    using (var mauiCanvas = new Microsoft.Maui.Graphics.Skia.SkiaCanvas())
                    {
                        mauiCanvas.Canvas = skCanvas;

                        var myCanvas = CanvasWrapper.Create(mauiCanvas);

                        myCanvas.DrawCircle((50, 50), 20, System.Drawing.Color.Red);

                        myCanvas.DrawRectangle((100, 10), (50, 50), System.Drawing.Color.White, 5, 3);
                    }
                }

                using (var memBmp = skBmp.UsingMemoryBitmap())
                {
                    memBmp.AsMemoryBitmap()
                    .ToMemoryBitmap(Pixel.RGBA32.Format)
                    .Save("maui.png");
                }
            }
        }
示例#2
0
        public static SkiaSharp.SKBitmap CloneAsSKBitmap(SpanBitmap bmp)
        {
            if (!TryGetPixelFormat(bmp.PixelFormat, out var color, out var alpha))
            {
                throw new ArgumentException("format", nameof(bmp));
            }

            var img = new SkiaSharp.SKBitmap(bmp.Width, bmp.Height, color, alpha);

            var binfo = GetBitmapInfo(img.Info, img.RowBytes);

            var ptr = img.GetPixels();

            if (ptr == IntPtr.Zero)
            {
                throw new ArgumentNullException();
            }

            var dst = new SpanBitmap(ptr, binfo);

            dst.SetPixels(0, 0, bmp);

            img.NotifyPixelsChanged();

            return(img);
        }
示例#3
0
 /// <summary>
 /// Copies the image to the specified bitmapdata instance
 /// </summary>
 public SkiaSharp.SKBitmap ToSKBitmap()
 {
     if (Updated || skBitmap == null)
     {
         skBitmap = ToImage().ToSKBitmap();
     }
     return(skBitmap);
 }
示例#4
0
        public static SkiaSharp.SKBitmap WrapAsSKBitmap(PointerBitmap src)
        {
            var wrapInfo = GetSKImageInfo(src.Info, false);

            var wrap = new SkiaSharp.SKBitmap();

            if (!wrap.InstallPixels(wrapInfo, src.Pointer, src.Info.StepByteSize))
            {
                throw new InvalidOperationException("InstallPixels");
            }
            return(wrap);
        }
示例#5
0
 public void Reset()
 {
     Document = null;
     Drawable = null;
     Picture  = null;
     Code     = null;
     SkiaPicture?.Dispose();
     SkiaPicture = null;
     ReferencePng?.Dispose();
     ReferencePng = null;
     PixelDiff?.Dispose();
     PixelDiff = null;
 }
        public SkiaMemoryManager(SkiaSharp.SKBitmap bmp)
        {
            _BitmapSource = bmp;
            _BitmapInfo   = _Implementation.GetBitmapInfo(bmp.Info, bmp.RowBytes);

            var ptr = bmp.GetPixels();

            if (ptr == IntPtr.Zero)
            {
                throw new ArgumentNullException();
            }

            Initialize(new PointerBitmap(ptr, _BitmapInfo));
        }
        public void AddNewImage(byte[] data)
        {
            try
            {
                using (SkiaSharp.SKBitmap original = SkiaSharp.SKBitmap.Decode(data))
                {
                    // Calculate new image size so biggest side is 1000 pixels
                    int width, height;
                    if (original.Width == original.Height)
                    {
                        width = height = 1000;
                    }
                    else if (original.Width > original.Height)
                    {
                        width  = 1000;
                        height = (int)(1000 * ((float)original.Height / original.Width));
                    }
                    else
                    {
                        height = 1000;
                        width  = (int)(1000 * ((float)original.Width / original.Height));
                    }

                    // Resize image and write to ImageData
                    using (SkiaSharp.SKBitmap resized = new SkiaSharp.SKBitmap(width, height, original.ColorType, original.AlphaType, original.ColorSpace))
                    {
                        if (original.ScalePixels(resized, SkiaSharp.SKFilterQuality.High))
                        {
                            using (MemoryStream stream = new MemoryStream())
                            {
                                if (resized.Encode(stream, SkiaSharp.SKEncodedImageFormat.Jpeg, 100))
                                {
                                    byte[] imageData = stream.ToArray();
                                    Item.AddNewImage(imageData);
                                }
                            }
                        }
                    }
                }

                NotifyPropertyChanged(nameof(IsPreviousImageAvailable));
                NotifyPropertyChanged(nameof(IsNextImageAvailable));
                NotifyPropertyChanged(nameof(IsDeleteImageAvailable));
            }
            catch (Exception e)
            {
                Debug.WriteLine($"Error loading image: {e.Message}");
            }
        }
示例#8
0
        public void SetIcon(SkiaSharp.SKBitmap icon)
        {
            if (icon == null)
            {
                UnmanagedMethods.PostMessage(_hwnd, (int)UnmanagedMethods.WindowsMessage.WM_SETICON,
                                             new IntPtr((int)UnmanagedMethods.Icons.ICON_BIG), IntPtr.Zero);

                return;
            }

            using var icon2 = icon.ToBitmap();

            UnmanagedMethods.PostMessage(_hwnd, (int)UnmanagedMethods.WindowsMessage.WM_SETICON,
                                         new IntPtr((int)UnmanagedMethods.Icons.ICON_BIG), icon2.GetHicon());
        }
示例#9
0
        public static SkiaSharp.SKBitmap?ToBitmap(this SkiaSharp.SKPicture skPicture, SkiaSharp.SKColor background, float scaleX, float scaleY, SkiaSharp.SKColorType skColorType, SkiaSharp.SKAlphaType skAlphaType, SkiaSharp.SKColorSpace skColorSpace)
        {
            var width  = skPicture.CullRect.Width * scaleX;
            var height = skPicture.CullRect.Height * scaleY;

            if (!(width > 0) || !(height > 0))
            {
                return(null);
            }
            var skImageInfo = new SkiaSharp.SKImageInfo((int)width, (int)height, skColorType, skAlphaType, skColorSpace);
            var skBitmap    = new SkiaSharp.SKBitmap(skImageInfo);

            using var skCanvas = new SkiaSharp.SKCanvas(skBitmap);
            Draw(skPicture, background, scaleX, scaleY, skCanvas);
            return(skBitmap);
        }
示例#10
0
 private Boolean CreateImageFile(String path, String svgResourceName, int size, String backgroundColor, String color)
 {
     if (!File.Exists(path))
     {
         // Get Svg with transparent background color and white color
         SkiaSharp.SKBitmap bitmap = Rainbow.Common.ImageTools.GetBitmapFromSvgResourceName(svgResourceName, size, backgroundColor, color);
         if (bitmap != null)
         {
             return(Rainbow.Common.ImageTools.SaveBitmapToFile(bitmap, path));
         }
         else
         {
             return(false);
         }
     }
     return(true);
 }
        /// <summary>
        /// Implementation of the GetOldBarcodeImage() method for IBarCodeGenerator interface.
        /// </summary>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public Image GetOldBarcodeImage(BarcodeParameters parameters)
        {
            if (parameters.PostalAddress == null)
                return null;

            BarcodeGenerator generator = new BarcodeGenerator(EncodeTypes.Postnet)
            {
                CodeText = parameters.PostalAddress
            };

            // Hardcode type for old-fashioned Barcode
            #if NET48 || JAVA
            return generator.GenerateBarCodeImage();
            #elif NET5_0 || __MOBILE__
            generator.GenerateBarCodeImage().Save(ArtifactsDir + "OldBarcodeImage.png");
            return Image.Decode(ArtifactsDir + "OldBarcodeImage.png");
            #endif
        }
        public void Draw(SkiaSharp.SKCanvas canvas)
        {
            var info       = this.info;
            var viewBounds = Bounds;
            var scale      = (float)UIKit.UIScreen.MainScreen.Scale;

            using (var image = new SkiaSharp.SKBitmap(info, info.RowBytes))
            {
                using (var pixels = image.PeekPixels())
                    using (var colorSpace = CGColorSpace.CreateDeviceRGB())
                        using (var ctx = new CGBitmapContext(pixels.GetPixels(), info.Width, info.Height, 8, info.RowBytes, colorSpace, CGBitmapFlags.PremultipliedLast | CGBitmapFlags.ByteOrder32Big))
                        {
                            ctx.ClearRect(viewBounds);
                            ctx.TranslateCTM(0, info.Height);
                            ctx.ScaleCTM(scale, -scale);
                            Layer.RenderInContext(ctx);
                        }
                canvas.DrawBitmap(image, SkiaSharp.SKPoint.Empty);
            }
        }
示例#13
0
        public static SpanBitmap WrapAsSpan(SkiaSharp.SKBitmap bmp, bool readOnly = false)
        {
            var wrapInfo = GetBitmapInfo(bmp.Info, bmp.RowBytes);

            if (readOnly)
            {
                return(new SpanBitmap(bmp.GetPixelSpan(), wrapInfo));
            }

            var wrapBytes = bmp.GetPixels();

            if (wrapBytes == IntPtr.Zero)
            {
                throw new ArgumentNullException();
            }

            return(new SpanBitmap(wrapBytes, wrapInfo));

            // should call bmp.NotifyPixelsChanged(); afterwards
        }
示例#14
0
        /// <summary>
        /// Implementation of the GetOldBarcodeImage() method for IBarCodeGenerator interface.
        /// </summary>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public Image GetOldBarcodeImage(BarcodeParameters parameters)
        {
            if (parameters.PostalAddress == null)
            {
                return(null);
            }

            BarCodeBuilder builder = new BarCodeBuilder
            {
                EncodeType = Aspose.BarCode.Generation.EncodeTypes.Postnet,
                CodeText   = parameters.PostalAddress
            };

            // Hardcode type for old-fashioned Barcode
#if NET462 || JAVA
            return(builder.BarCodeImage);
#elif NETCOREAPP2_1 || __MOBILE__
            builder.BarCodeImage.Save(ApiExampleBase.ArtifactsDir + "OldBarcodeImage.png");
            return(Image.Decode(ApiExampleBase.ArtifactsDir + "OldBarcodeImage.png"));
#endif
        }
示例#15
0
        static void Init(GlFwForm form)
        {
            s_mainForm = form;

            //PART1:
            //1. storage io
            PixelFarm.Platforms.StorageService.RegisterProvider(new YourImplementation.LocalFileStorageProvider(""));

            //2. img-io implementation
            PixelFarm.CpuBlit.MemBitmapExt.DefaultMemBitmapIO = new YourImplementation.ImgCodecMemBitmapIO(); // new PixelFarm.Drawing.WinGdi.GdiBitmapIO();

            //------------------------------------------------------------------------
            //5. image-IO (optional)
            //if we don't set this, it will error on read-write image
            //you can implement this with other lib that can read-write images

            var pars = new PixelFarm.Platforms.ImageIOSetupParameters();

            pars.SaveToPng = (IntPtr imgBuffer, int stride, int width, int height, string filename) =>
            {
                MemBitmap memBmp = new MemBitmap(width, height, imgBuffer);
                using (FileStream fs = new FileStream(filename, FileMode.Create))
                {
                    PixelFarm.CpuBlit.MemBitmapExt.DefaultMemBitmapIO.SaveImage(memBmp, fs,
                                                                                MemBitmapIO.OutputImageFormat.Png,
                                                                                null);
                }

                //--- save with GDI+---
                //using (System.Drawing.Bitmap newBmp = new System.Drawing.Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
                //{
                //    PixelFarm.CpuBlit.BitmapHelper.CopyToGdiPlusBitmapSameSize(imgBuffer, newBmp);
                //    //save
                //    newBmp.Save(filename);
                //}
            };

            pars.ReadFromMemStream = (System.IO.MemoryStream ms, string kind) =>
            {
                //on .net core, we can use skia
                SkiaSharp.SKBitmap skbitmap = SkiaSharp.SKBitmap.Decode(ms);
                //copy to mem bitmap
                MemBitmap memBmp = new MemBitmap(skbitmap.Width, skbitmap.Height);
                IntPtr    ptr    = skbitmap.GetAddr(0, 0);
                unsafe
                {
                    using (var ptr1 = MemBitmap.GetBufferPtr(memBmp))
                    {
                        PixelFarm.Drawing.Internal.MemMx.memcpy((byte *)ptr1.Ptr, (byte *)ptr, skbitmap.RowBytes * skbitmap.Height);
                    }
                }
                return(memBmp);

                //return PixelFarm.CpuBlit.MemBitmapExtensions.DefaultMemBitmapIO.LoadImage(ms);
                //read/guest img format

                //--- load img with GDI+---
                ////read
                //using (System.Drawing.Bitmap gdiBmp = new System.Drawing.Bitmap(ms))
                //{
                //    PixelFarm.CpuBlit.MemBitmap memBmp = new PixelFarm.CpuBlit.MemBitmap(gdiBmp.Width, gdiBmp.Height);
                //    //#if DEBUG
                //    //                        memBmp._dbugNote = "img;
                //    //#endif

                //    PixelFarm.CpuBlit.BitmapHelper.CopyFromGdiPlusBitmapSameSizeTo32BitsBuffer(gdiBmp, memBmp);
                //    return memBmp;
                //}
            };
            PixelFarm.Platforms.ImageIOPortal.Setup(pars);
            //------------------------------------------------------------------------

            //3. setup text-breaker
            string icu_datadir = "brkitr"; //see brkitr folder, we link data from Typography project and copy to output if newer

            if (!System.IO.Directory.Exists(icu_datadir))
            {
                throw new System.NotSupportedException("dic");
            }
            Typography.TextBreak.CustomBreakerBuilder.Setup(new Typography.TextBreak.IcuSimpleTextFileDictionaryProvider()
            {
                DataDir = icu_datadir
            });

            //---------------------------------------------------------------------------
            //4. Typography TextService
            Typography.Text.OpenFontTextService textService = new Typography.Text.OpenFontTextService();
            textService.LoadFontsFromFolder("Fonts");

            GlobalTextService.TxtClient   = textService.CreateNewServiceClient();
            GlobalTextService.TextService = GlobalTextService.TxtClient;
            //---------------------------------------------------------------------------


            //PART2: root graphics
            Size primScreenSize = UIPlatform.CurrentPlatform.GetPrimaryMonitorSize();

            s_myRootGfx = new MyRootGraphic(primScreenSize.Width, primScreenSize.Height);
            s_viewroot  = new GraphicsViewRoot(primScreenSize.Width, primScreenSize.Height);
            MyGlfwTopWindowBridge bridge1 = new MyGlfwTopWindowBridge(s_myRootGfx, s_myRootGfx.TopWinEventPortal);

            ((MyGlfwTopWindowBridge.GlfwEventBridge)(form.WindowEventListener)).SetWindowBridge(bridge1);


            var glfwWindowWrapper = new GlfwWindowWrapper(form);

            bridge1.BindWindowControl(glfwWindowWrapper);

            s_viewroot.InitRootGraphics(s_myRootGfx,
                                        s_myRootGfx.TopWinEventPortal,
                                        InnerViewportKind.GLES,
                                        glfwWindowWrapper,
                                        bridge1);



            //------------------------------------------------------------------------
            //optional:
            if (s_viewroot.GetGLPainter() is GLPainter glPainter)
            {
                glPainter.SmoothingMode = SmoothingMode.AntiAlias;
            }
        }
示例#16
0
        /////////////////////////////////////////////////////////////////////////////////////

        public static void CopyToGdiPlusBitmapSameSize(
            ActualImage actualImage,
            SkiaSharp.SKBitmap skBmp)
        {
            //agg store image buffer head-down
            //when copy to window bmp we here to flip
            //style1: copy row by row *** (fastest)***
            {
                //System.GC.Collect();
                //System.Diagnostics.Stopwatch sss = new System.Diagnostics.Stopwatch();
                //sss.Start();
                //for (int i = 0; i < 1000; ++i)
                //{
                int h = skBmp.Height;
                int w = skBmp.Width;


                //BitmapData bitmapData1 = bitmap.LockBits(
                //          new Rectangle(0, 0,
                //              w,
                //              h),
                //              System.Drawing.Imaging.ImageLockMode.ReadWrite,
                //              bitmap.PixelFormat);
                skBmp.LockPixels();
                IntPtr scan0  = skBmp.GetPixels();
                int    stride = actualImage.Stride;
                //byte[] srcBuffer = ActualImage.GetBuffer(actualImage);
                unsafe
                {
                    TempMemPtr srcBufferPtr = ActualImage.GetBufferPtr(actualImage);
                    //fixed (byte* bufferH = &srcBuffer[0])
                    byte *bufferH = (byte *)srcBufferPtr.Ptr;
                    {
                        byte *target     = (byte *)scan0;
                        int   startRowAt = ((h - 1) * stride);
                        for (int y = h; y > 0; --y)
                        {
                            //byte* src = bufferH + ((y - 1) * stride);
                            //System.Runtime.InteropServices.Marshal.Copy(
                            //   srcBuffer,//src
                            //   startRowAt,
                            //   (IntPtr)target,
                            //   stride);
                            AggMemMx.memcpy(target, bufferH + startRowAt, stride);
                            startRowAt -= stride;
                            target     += stride;
                        }
                    }
                    srcBufferPtr.Release();
                }
                skBmp.UnlockPixels();
                //}
                //sss.Stop();
                //long ms = sss.ElapsedMilliseconds;
            }
            //-----------------------------------
            //style2: copy all, then flip again
            //{
            //    System.GC.Collect();
            //    System.Diagnostics.Stopwatch sss = new System.Diagnostics.Stopwatch();
            //    sss.Start();
            //    for (int i = 0; i < 1000; ++i)
            //    {
            //        byte[] rawBuffer = ActualImage.GetBuffer(actualImage);
            //        var bmpdata = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
            //          System.Drawing.Imaging.ImageLockMode.ReadOnly,
            //         bitmap.PixelFormat);


            //        System.Runtime.InteropServices.Marshal.Copy(rawBuffer, 0,
            //            bmpdata.Scan0, rawBuffer.Length);

            //        bitmap.UnlockBits(bmpdata);
            //        bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
            //    }

            //    sss.Stop();
            //    long ms = sss.ElapsedMilliseconds;
            //}
            //-----------------------------------

            //-----------------------------------
            //style3: copy row by row +
            //{
            //    System.GC.Collect();
            //    System.Diagnostics.Stopwatch sss = new System.Diagnostics.Stopwatch();
            //    sss.Start();
            //    for (int i = 0; i < 1000; ++i)
            //    {
            //        int h = bitmap.Height;
            //        int w = bitmap.Width;
            //        BitmapData bitmapData1 = bitmap.LockBits(
            //                  new Rectangle(0, 0,
            //                      w,
            //                      h),
            //                      System.Drawing.Imaging.ImageLockMode.ReadWrite,
            //                      bitmap.PixelFormat);
            //        IntPtr scan0 = bitmapData1.Scan0;
            //        int stride = bitmapData1.Stride;
            //        byte[] buffer = ActualImage.GetBuffer(actualImage);
            //        unsafe
            //        {
            //            fixed (byte* bufferH = &buffer[0])
            //            {
            //                byte* target = (byte*)scan0;
            //                for (int y = h; y > 0; --y)
            //                {
            //                    byte* src = bufferH + ((y - 1) * stride);
            //                    for (int n = stride - 1; n >= 0; --n)
            //                    {
            //                        *target = *src;
            //                        target++;
            //                        src++;
            //                    }
            //                }
            //            }
            //        }
            //        bitmap.UnlockBits(bitmapData1);
            //    }
            //    sss.Stop();
            //    long ms = sss.ElapsedMilliseconds;
            //}
        }
示例#17
0
        //########################################################################################

        #region Constructor / Dispose / Finalizer

        /// <summary>
        /// Constructor with the SKBitmap
        /// </summary>
        /// <param name="bitmap"></param>
        public SKBitmapRawImage(SkiaSharp.SKBitmap bitmap)
        {
            Bitmap = bitmap;
        }
示例#18
0
        public void PaintMe(IntPtr hdc)
        {
            if (this.IsClosed)
            {
                return;
            }
            _rootGraphics.PrepareRender();
            //---------------
            _rootGraphics.IsInRenderPhase = true;
#if DEBUG
            _rootGraphics.dbug_rootDrawingMsg.Clear();
            _rootGraphics.dbug_drawLevel = 0;
#endif

            //1. clear sk surface
            mySkCanvas.Clear(PixelFarm.Drawing.Color.White);
            //2. render to the surface
            UpdateAllArea(mySkCanvas, _rootGraphics.TopWindowRenderBox);
            //3. copy bitmap buffer from the surface and render to final hdc

            //-----------------------------------------------
            //TODO: review performance here
            //we should copy from unmanaged (skia bitmap)
            //and write to unmanaged (hdc'bitmap)

            SkiaSharp.SKBitmap backBmp = mySkCanvas.BackBmp;
            backBmp.LockPixels();
            IntPtr h      = backBmp.GetPixels();
            int    w1     = backBmp.Width;
            int    h1     = backBmp.Height;
            int    stride = backBmp.RowBytes;
            //PixelFarm.Agg.AggMemMx.memcpy()
            //System.Runtime.InteropServices.Marshal.Copy(
            //    h, tmpBuffer, 0, tmpBuffer.Length
            //    );
            //copy skia pixels to our dc
            unsafe
            {
                //Win32.MyWin32.memcpy((byte*)memdc.PPVBits, (byte*)h, internalSizeW * 4 * internalSizwH);
                memdc.CopyPixelBitsToOutput((byte *)h);
            }
            backBmp.UnlockPixels();

            //bitblt to target
            memdc.BitBltTo(hdc);
            //var bmpdata = tmpBmp.LockBits(new System.Drawing.Rectangle(0, 0, w1, h1),
            //    System.Drawing.Imaging.ImageLockMode.ReadWrite,
            //    System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            //System.Runtime.InteropServices.Marshal.Copy(tmpBuffer, 0, bmpdata.Scan0, tmpBuffer.Length);
            //tmpBmp.UnlockBits(bmpdata);
            //using (System.Drawing.Graphics g2 = System.Drawing.Graphics.FromHdc(hdc))
            //{
            //    g2.DrawImage(tmpBmp, 0, 0);
            //}
            //-----------------------------------------------------------------------------
            _rootGraphics.IsInRenderPhase = false;
#if DEBUG
            RootGraphic visualroot = RootGraphic.dbugCurrentGlobalVRoot;
            if (visualroot.dbug_RecordDrawingChain)
            {
                List <dbugLayoutMsg> outputMsgs = dbugOutputWindow.dbug_rootDocDebugMsgs;
                outputMsgs.Clear();
                outputMsgs.Add(new dbugLayoutMsg(null as RenderElement, "[" + debug_render_to_output_count + "]"));
                visualroot.dbug_DumpRootDrawingMsg(outputMsgs);
                dbugOutputWindow.dbug_InvokeVisualRootDrawMsg();
                debug_render_to_output_count++;
            }


            if (dbugHelper01.dbugVE_HighlightMe != null)
            {
                dbugOutputWindow.dbug_HighlightMeNow(dbugHelper01.dbugVE_HighlightMe.dbugGetGlobalRect());
            }
#endif
        }
        /// <summary>
        /// Implementation of the GetBarCodeImage() method for IBarCodeGenerator interface.
        /// </summary>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public Image GetBarcodeImage(BarcodeParameters parameters)
        {
            if (parameters.BarcodeType == null || parameters.BarcodeValue == null)
            {
                return(null);
            }

            BarcodeGenerator generator = new BarcodeGenerator(EncodeTypes.QR);

            string type = parameters.BarcodeType.ToUpper();

            switch (type)
            {
            case "QR":
                generator = new BarcodeGenerator(EncodeTypes.QR);
                break;

            case "CODE128":
                generator = new BarcodeGenerator(EncodeTypes.Code128);
                break;

            case "CODE39":
                generator = new BarcodeGenerator(EncodeTypes.Code39Standard);
                break;

            case "EAN8":
                generator = new BarcodeGenerator(EncodeTypes.EAN8);
                break;

            case "EAN13":
                generator = new BarcodeGenerator(EncodeTypes.EAN13);
                break;

            case "UPCA":
                generator = new BarcodeGenerator(EncodeTypes.UPCA);
                break;

            case "UPCE":
                generator = new BarcodeGenerator(EncodeTypes.UPCE);
                break;

            case "ITF14":
                generator = new BarcodeGenerator(EncodeTypes.ITF14);
                break;

            case "CASE":
                generator = new BarcodeGenerator(EncodeTypes.None);
                break;
            }

            if (generator.BarcodeType.Equals(EncodeTypes.None))
            {
                return(null);
            }

            generator.CodeText = parameters.BarcodeValue;

            if (generator.BarcodeType.Equals(EncodeTypes.QR))
            {
                generator.Parameters.Barcode.CodeTextParameters.TwoDDisplayText = parameters.BarcodeValue;
            }

            if (parameters.ForegroundColor != null)
            {
                generator.Parameters.Barcode.BarColor = ConvertColor(parameters.ForegroundColor);
            }

            if (parameters.BackgroundColor != null)
            {
                generator.Parameters.BackColor = ConvertColor(parameters.BackgroundColor);
            }

            if (parameters.SymbolHeight != null)
            {
                generator.Parameters.ImageHeight.Pixels = ConvertSymbolHeight(parameters.SymbolHeight);
                generator.Parameters.AutoSizeMode       = AutoSizeMode.None;
            }

            generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.None;

            if (parameters.DisplayText)
            {
                generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
            }

            generator.Parameters.CaptionAbove.Text = "";

            const float scale = 2.4f; // Empiric scaling factor for converting Word barcode to Aspose.BarCode
            float       xdim  = 1.0f;

            if (generator.BarcodeType.Equals(EncodeTypes.QR))
            {
                generator.Parameters.AutoSizeMode       = AutoSizeMode.Nearest;
                generator.Parameters.ImageWidth.Inches *= scale;
                generator.Parameters.ImageHeight.Inches = generator.Parameters.ImageWidth.Inches;
                xdim = generator.Parameters.ImageHeight.Inches / 25;
                generator.Parameters.Barcode.XDimension.Inches    =
                    generator.Parameters.Barcode.BarHeight.Inches = xdim;
            }

            if (parameters.ScalingFactor != null)
            {
                float scalingFactor = ConvertScalingFactor(parameters.ScalingFactor);
                generator.Parameters.ImageHeight.Inches *= scalingFactor;

                if (generator.BarcodeType.Equals(EncodeTypes.QR))
                {
                    generator.Parameters.ImageWidth.Inches            = generator.Parameters.ImageHeight.Inches;
                    generator.Parameters.Barcode.XDimension.Inches    =
                        generator.Parameters.Barcode.BarHeight.Inches = xdim * scalingFactor;
                }

                generator.Parameters.AutoSizeMode = AutoSizeMode.None;
            }

#if NET462 || JAVA
            return(generator.GenerateBarCodeImage());
#elif NETCOREAPP2_1 || __MOBILE__
            generator.GenerateBarCodeImage().Save(ArtifactsDir + "GetBarcodeImage.png");
            return(Image.Decode(ArtifactsDir + "GetBarcodeImage.png"));
#endif
        }
示例#20
0
 public void SetIcon(SkiaSharp.SKBitmap icon)
 {
     // NO OP on OSX
 }
示例#21
0
        public static byte[] ImageScalingToRange(string path, int maxWidth, int maxHeight, int quality)
        {
            byte[] bytes = null;
            if (!System.IO.File.Exists(path))
            {
                return(bytes);
            }
            var fileStream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read); //fileInfo.OpenRead();

            if (fileStream.Length > maxLength)
            {
                fileStream.Dispose();
                return(bytes);
            }
            var sKManagedStream = new SkiaSharp.SKManagedStream(fileStream, true);
            var sKBitmap        = SkiaSharp.SKBitmap.Decode(sKManagedStream);

            sKManagedStream.Dispose();

            if (sKBitmap.IsEmpty)
            {
                return(bytes);
            }

            if (maxWidth < 1)
            {
                maxWidth = 1;
            }
            if (maxHeight < 1)
            {
                maxHeight = 1;
            }
            if (quality < 1)
            {
                quality = 1;
            }
            if (quality > 100)
            {
                quality = 100;
            }

            int oW = sKBitmap.Width;
            int oH = sKBitmap.Height;
            int nW = oW;
            int nH = oH;

            if (nW < maxWidth && nH < maxHeight)//放大
            {
                if (nW < maxWidth)
                {
                    var r = (double)maxWidth / (double)nW;
                    nW = maxWidth;
                    nH = (int)Math.Floor((double)nH * r);
                }
                if (nH < maxHeight)
                {
                    var r = (double)maxHeight / (double)nH;
                    nH = maxHeight;
                    nW = (int)Math.Floor((double)nW * r);
                }
            }
            //限制超出(缩小)
            if (nW > maxWidth)
            {
                var r = (double)maxWidth / (double)nW;
                nW = maxWidth;
                nH = (int)Math.Floor((double)nH * r);
            }
            if (nH > maxHeight)
            {
                var r = (double)maxHeight / (double)nH;
                nH = maxHeight;
                nW = (int)Math.Floor((double)nW * r);
            }


            var sKBitmap2 = new SkiaSharp.SKBitmap(nW, nH);
            var sKCanvas  = new SkiaSharp.SKCanvas(sKBitmap2);
            var sKPaint   = new SkiaSharp.SKPaint
            {
                FilterQuality = SkiaSharp.SKFilterQuality.Medium,
                IsAntialias   = true
            };

            sKCanvas.DrawBitmap(
                sKBitmap,
                new SkiaSharp.SKRect
            {
                Location = new SkiaSharp.SKPoint {
                    X = 0, Y = 0
                },
                Size = new SkiaSharp.SKSize {
                    Height = oH, Width = oW
                }
            },
                new SkiaSharp.SKRect
            {
                Location = new SkiaSharp.SKPoint {
                    X = 0, Y = 0
                },
                Size = new SkiaSharp.SKSize {
                    Height = nH, Width = nW
                }
            }, sKPaint);
            sKCanvas.Dispose();
            var sKImage2 = SkiaSharp.SKImage.FromBitmap(sKBitmap2);

            sKBitmap2.Dispose();
            var data = sKImage2.Encode(GetImageFormatByPath(path), quality);

            sKImage2.Dispose();
            bytes = data.ToArray();
            data.Dispose();

            return(bytes);
        }
示例#22
0
 public static MemoryBitmap.IDisposableSource UsingMemoryBitmap(this SkiaSharp.SKBitmap bmp)
 {
     return(new Adapters.SkiaMemoryManager(bmp));
 }
示例#23
0
        public static byte[] ImageScalingByOversized(string path, int maxWidth, int maxHeight, int quality)
        {
            byte[] bytes = null;
            if (!System.IO.File.Exists(path))
            {
                return(bytes);
            }
            var fileStream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);

            if (fileStream.Length > maxLength)
            {
                fileStream.Dispose();
                return(bytes);
            }
            var sKManagedStream = new SkiaSharp.SKManagedStream(fileStream, true);
            var sKBitmap        = SkiaSharp.SKBitmap.Decode(sKManagedStream);

            sKManagedStream.Dispose();

            if (sKBitmap.IsEmpty)
            {
                return(bytes);
            }

            if (maxWidth < 1)
            {
                maxWidth = 1;
            }
            if (maxHeight < 1)
            {
                maxHeight = 1;
            }
            if (quality < 1)
            {
                quality = 1;
            }
            if (quality > 100)
            {
                quality = 100;
            }

            int oW = sKBitmap.Width;
            int oH = sKBitmap.Height;
            int nW = oW;
            int nH = oH;

            if (oW > maxWidth || oH > maxHeight)
            {
                nW = maxWidth;
                nH = maxHeight;
                double ratio = 1;

                if (nW > 0 && nH > 0)
                {
                    ratio = (double)nW / oW;
                    nH    = Convert.ToInt32(oH * ratio);
                    if (maxHeight < nH)
                    {
                        ratio = (double)maxHeight / nH;
                        nW    = Convert.ToInt32(nW * ratio);
                        nH    = maxHeight;
                    }
                }
                if (nW < 1 && nH < 1)
                {
                    nW = oW;
                    nH = oH;
                }
                if (nW < 1)
                {
                    ratio = (double)nH / oH;
                    nW    = Convert.ToInt32(oW * ratio);
                }
                if (nH < 1)
                {
                    ratio = (double)nW / oW;
                    nH    = Convert.ToInt32(oH * ratio);
                }
                var sKBitmap2 = new SkiaSharp.SKBitmap(nW, nH);
                var sKCanvas  = new SkiaSharp.SKCanvas(sKBitmap2);
                var sKPaint   = new SkiaSharp.SKPaint
                {
                    FilterQuality = SkiaSharp.SKFilterQuality.Medium,
                    IsAntialias   = true
                };
                sKCanvas.DrawBitmap(
                    sKBitmap,
                    new SkiaSharp.SKRect
                {
                    Location = new SkiaSharp.SKPoint {
                        X = 0, Y = 0
                    },
                    Size = new SkiaSharp.SKSize {
                        Height = oH, Width = oW
                    }
                },
                    new SkiaSharp.SKRect
                {
                    Location = new SkiaSharp.SKPoint {
                        X = 0, Y = 0
                    },
                    Size = new SkiaSharp.SKSize {
                        Height = nH, Width = nW
                    }
                }, sKPaint);
                sKCanvas.Dispose();
                sKBitmap.Dispose();
                sKBitmap = sKBitmap2;
            }

            var sKImage = SkiaSharp.SKImage.FromBitmap(sKBitmap);

            sKBitmap.Dispose();
            var data = sKImage.Encode(GetImageFormatByPath(path), quality);

            sKImage.Dispose();
            bytes = data.ToArray();
            data.Dispose();

            return(bytes);
        }
示例#24
0
        /// <summary>
        /// 生成二维码(320*320)
        /// </summary>
        /// <param name="text">文本内容</param>
        /// <param name="format">保存格式</param>
        /// <param name="logoImgae">Logo图片(缩放到真实二维码区域尺寸的1/6)</param>
        /// <param name="keepWhiteBorderPixelVal">白边处理(负值表示不做处理,最大值不超过真实二维码区域的1/10)</param>
        /// <returns></returns>
        public static byte[] QRCoder(string text, SkiaSharp.SKEncodedImageFormat format, byte[] logoImgae = null, int keepWhiteBorderPixelVal = -1)
        {
            byte[] reval        = null;
            int    width        = 320;
            int    height       = 320;
            var    qRCodeWriter = new ZXing.QrCode.QRCodeWriter();
            var    hints        = new Dictionary <ZXing.EncodeHintType, object>();

            hints.Add(ZXing.EncodeHintType.CHARACTER_SET, "utf-8");
            hints.Add(ZXing.EncodeHintType.QR_VERSION, 8);
            hints.Add(ZXing.EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.Q);
            var bitMatrix = qRCodeWriter.encode(text, ZXing.BarcodeFormat.QR_CODE, width, height, hints);
            var w         = bitMatrix.Width;
            var h         = bitMatrix.Height;
            var sKBitmap  = new SkiaSharp.SKBitmap(w, h);

            int blackStartPointX = 0;
            int blackStartPointY = 0;
            int blackEndPointX   = w;
            int blackEndPointY   = h;

            #region --绘制二维码(同时获取真实的二维码区域起绘点和结束点的坐标)--
            var sKCanvas     = new SkiaSharp.SKCanvas(sKBitmap);
            var sKColorBlack = SkiaSharp.SKColor.Parse("000000");
            var sKColorWihte = SkiaSharp.SKColor.Parse("ffffff");
            sKCanvas.Clear(sKColorWihte);
            bool blackStartPointIsNotWriteDown = true;
            for (var y = 0; y < h; y++)
            {
                for (var x = 0; x < w; x++)
                {
                    var flag = bitMatrix[x, y];
                    if (flag)
                    {
                        if (blackStartPointIsNotWriteDown)
                        {
                            blackStartPointX = x;
                            blackStartPointY = y;
                            blackStartPointIsNotWriteDown = false;
                        }
                        blackEndPointX = x;
                        blackEndPointY = y;
                        sKCanvas.DrawPoint(x, y, sKColorBlack);
                    }
                    else
                    {
                        //sKCanvas.DrawPoint(x, y, sKColorWihte);//不用绘制(背景是白色的)
                    }
                }
            }
            sKCanvas.Dispose();
            #endregion

            int qrcodeRealWidth  = blackEndPointX - blackStartPointX;
            int qrcodeRealHeight = blackEndPointY - blackStartPointY;

            #region -- 处理白边 --
            if (keepWhiteBorderPixelVal > -1)//指定了边框宽度
            {
                var borderMaxWidth = (int)Math.Floor((double)qrcodeRealWidth / 10);
                if (keepWhiteBorderPixelVal > borderMaxWidth)
                {
                    keepWhiteBorderPixelVal = borderMaxWidth;
                }
                var nQrcodeRealWidth  = width - keepWhiteBorderPixelVal - keepWhiteBorderPixelVal;
                var nQrcodeRealHeight = height - keepWhiteBorderPixelVal - keepWhiteBorderPixelVal;

                var sKBitmap2 = new SkiaSharp.SKBitmap(width, height);
                var sKCanvas2 = new SkiaSharp.SKCanvas(sKBitmap2);
                sKCanvas2.Clear(sKColorWihte);
                //二维码绘制到临时画布上时无需抗锯齿等处理(避免文件增大)
                sKCanvas2.DrawBitmap(
                    sKBitmap,
                    new SkiaSharp.SKRect
                {
                    Location = new SkiaSharp.SKPoint {
                        X = blackStartPointX, Y = blackStartPointY
                    },
                    Size = new SkiaSharp.SKSize {
                        Height = qrcodeRealHeight, Width = qrcodeRealWidth
                    }
                },
                    new SkiaSharp.SKRect
                {
                    Location = new SkiaSharp.SKPoint {
                        X = keepWhiteBorderPixelVal, Y = keepWhiteBorderPixelVal
                    },
                    Size = new SkiaSharp.SKSize {
                        Width = nQrcodeRealWidth, Height = nQrcodeRealHeight
                    }
                });

                blackStartPointX = keepWhiteBorderPixelVal;
                blackStartPointY = keepWhiteBorderPixelVal;
                qrcodeRealWidth  = nQrcodeRealWidth;
                qrcodeRealHeight = nQrcodeRealHeight;

                sKCanvas2.Dispose();
                sKBitmap.Dispose();
                sKBitmap = sKBitmap2;
            }
            #endregion

            #region -- 绘制LOGO --
            if (logoImgae != null && logoImgae.Length > 0)
            {
                SkiaSharp.SKBitmap sKBitmapLogo = SkiaSharp.SKBitmap.Decode(logoImgae);
                if (!sKBitmapLogo.IsEmpty)
                {
                    var sKPaint2 = new SkiaSharp.SKPaint
                    {
                        FilterQuality = SkiaSharp.SKFilterQuality.None,
                        IsAntialias   = true
                    };
                    var logoTargetMaxWidth  = (int)Math.Floor((double)qrcodeRealWidth / 6);
                    var logoTargetMaxHeight = (int)Math.Floor((double)qrcodeRealHeight / 6);
                    var qrcodeCenterX       = (int)Math.Floor((double)qrcodeRealWidth / 2);
                    var qrcodeCenterY       = (int)Math.Floor((double)qrcodeRealHeight / 2);
                    var logoResultWidth     = sKBitmapLogo.Width;
                    var logoResultHeight    = sKBitmapLogo.Height;
                    if (logoResultWidth > logoTargetMaxWidth)
                    {
                        var r = (double)logoTargetMaxWidth / logoResultWidth;
                        logoResultWidth  = logoTargetMaxWidth;
                        logoResultHeight = (int)Math.Floor(logoResultHeight * r);
                    }
                    if (logoResultHeight > logoTargetMaxHeight)
                    {
                        var r = (double)logoTargetMaxHeight / logoResultHeight;
                        logoResultHeight = logoTargetMaxHeight;
                        logoResultWidth  = (int)Math.Floor(logoResultWidth * r);
                    }
                    var pointX = qrcodeCenterX - (int)Math.Floor((double)logoResultWidth / 2) + blackStartPointX;
                    var pointY = qrcodeCenterY - (int)Math.Floor((double)logoResultHeight / 2) + blackStartPointY;

                    var sKCanvas3 = new SkiaSharp.SKCanvas(sKBitmap);
                    var sKPaint   = new SkiaSharp.SKPaint
                    {
                        FilterQuality = SkiaSharp.SKFilterQuality.Medium,
                        IsAntialias   = true
                    };
                    sKCanvas3.DrawBitmap(
                        sKBitmapLogo,
                        new SkiaSharp.SKRect
                    {
                        Location = new SkiaSharp.SKPoint {
                            X = 0, Y = 0
                        },
                        Size = new SkiaSharp.SKSize {
                            Height = sKBitmapLogo.Height, Width = sKBitmapLogo.Width
                        }
                    },
                        new SkiaSharp.SKRect
                    {
                        Location = new SkiaSharp.SKPoint {
                            X = pointX, Y = pointY
                        },
                        Size = new SkiaSharp.SKSize {
                            Height = logoResultHeight, Width = logoResultWidth
                        }
                    }, sKPaint);
                    sKCanvas3.Dispose();
                    sKPaint.Dispose();
                    sKBitmapLogo.Dispose();
                }
                else
                {
                    sKBitmapLogo.Dispose();
                }
            }
            #endregion

            SkiaSharp.SKImage sKImage = SkiaSharp.SKImage.FromBitmap(sKBitmap);
            sKBitmap.Dispose();
            var data = sKImage.Encode(format, 75);
            sKImage.Dispose();
            reval = data.ToArray();
            data.Dispose();

            return(reval);
        }
示例#25
0
        /// <summary>
        /// Implementation of the GetBarCodeImage() method for IBarCodeGenerator interface.
        /// </summary>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public Image GetBarcodeImage(BarcodeParameters parameters)
        {
            if (parameters.BarcodeType == null || parameters.BarcodeValue == null)
            {
                return(null);
            }

            BarCodeBuilder builder = new BarCodeBuilder();

            string type = parameters.BarcodeType.ToUpper();

            switch (type)
            {
            case "QR":
                builder.EncodeType = Aspose.BarCode.Generation.EncodeTypes.QR;
                break;

            case "CODE128":
                builder.EncodeType = Aspose.BarCode.Generation.EncodeTypes.Code128;
                break;

            case "CODE39":
                builder.EncodeType = Aspose.BarCode.Generation.EncodeTypes.Code39Standard;
                break;

            case "EAN8":
                builder.EncodeType = Aspose.BarCode.Generation.EncodeTypes.EAN8;
                break;

            case "EAN13":
                builder.EncodeType = Aspose.BarCode.Generation.EncodeTypes.EAN13;
                break;

            case "UPCA":
                builder.EncodeType = Aspose.BarCode.Generation.EncodeTypes.UPCA;
                break;

            case "UPCE":
                builder.EncodeType = Aspose.BarCode.Generation.EncodeTypes.UPCE;
                break;

            case "ITF14":
                builder.EncodeType = Aspose.BarCode.Generation.EncodeTypes.ITF14;
                break;

            case "CASE":
                builder.EncodeType = Aspose.BarCode.Generation.EncodeTypes.None;
                break;
            }

            if (builder.EncodeType.Equals(Aspose.BarCode.Generation.EncodeTypes.None))
            {
                return(null);
            }

            builder.CodeText = parameters.BarcodeValue;

            if (builder.EncodeType.Equals(Aspose.BarCode.Generation.EncodeTypes.QR))
            {
                builder.Display2DText = parameters.BarcodeValue;
            }

            if (parameters.ForegroundColor != null)
            {
                builder.ForeColor = ConvertColor(parameters.ForegroundColor);
            }

            if (parameters.BackgroundColor != null)
            {
                builder.BackColor = ConvertColor(parameters.BackgroundColor);
            }

            if (parameters.SymbolHeight != null)
            {
                builder.ImageHeight = ConvertSymbolHeight(parameters.SymbolHeight);
                builder.AutoSize    = false;
            }

            builder.CodeLocation = CodeLocation.None;

            if (parameters.DisplayText)
            {
                builder.CodeLocation = CodeLocation.Below;
            }

            builder.CaptionAbove.Text = "";

            const float scale = 0.4f; // Empiric scaling factor for converting Word barcode to Aspose.BarCode
            float       xdim  = 1.0f;

            if (builder.EncodeType.Equals(Aspose.BarCode.Generation.EncodeTypes.QR))
            {
                builder.AutoSize    = false;
                builder.ImageWidth *= scale;
                builder.ImageHeight = builder.ImageWidth;
                xdim = builder.ImageHeight / 25;
                builder.xDimension = builder.yDimension = xdim;
            }

            if (parameters.ScalingFactor != null)
            {
                float scalingFactor = ConvertScalingFactor(parameters.ScalingFactor);
                builder.ImageHeight *= scalingFactor;
                if (builder.EncodeType.Equals(Aspose.BarCode.Generation.EncodeTypes.QR))
                {
                    builder.ImageWidth = builder.ImageHeight;
                    builder.xDimension = builder.yDimension = xdim * scalingFactor;
                }

                builder.AutoSize = false;
            }

#if NET462 || JAVA
            return(builder.BarCodeImage);
#elif NETCOREAPP2_1 || __MOBILE__
            builder.BarCodeImage.Save(ArtifactsDir + "GetBarcodeImage.png");
            return(Image.Decode(ArtifactsDir + "OldBarcodeImage.png"));
#endif
        }
示例#26
0
        public static byte[] ImageMaxCutByCenter(string path, int saveWidth, int saveHeight, int quality)
        {
            byte[] bytes = null;
            if (!System.IO.File.Exists(path))
            {
                return(bytes);
            }
            var fileStream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read); //fileInfo.OpenRead();

            if (fileStream.Length > maxLength)
            {
                fileStream.Dispose();
                return(bytes);
            }
            var sKManagedStream = new SkiaSharp.SKManagedStream(fileStream, true);
            var sKBitmap        = SkiaSharp.SKBitmap.Decode(sKManagedStream);

            sKManagedStream.Dispose();

            if (sKBitmap.IsEmpty)
            {
                return(bytes);
            }

            if (saveWidth < 1)
            {
                saveWidth = 1;
            }
            if (saveHeight < 1)
            {
                saveHeight = 1;
            }
            if (quality < 1)
            {
                quality = 1;
            }
            if (quality > 100)
            {
                quality = 100;
            }

            int    oW    = sKBitmap.Width;
            int    oH    = sKBitmap.Height;
            int    cutW  = saveWidth;
            int    cutH  = saveHeight;
            double ratio = 1;

            if (cutW > oW)
            {
                ratio = (double)oW / (double)cutW;
                cutH  = Convert.ToInt32((double)cutH * ratio);
                cutW  = oW;
                if (cutH > oH)
                {
                    ratio = (double)oH / (double)cutH;
                    cutW  = Convert.ToInt32((double)cutW * ratio);
                    cutH  = oH;
                }
            }
            else if (cutW < oW)
            {
                ratio = (double)oW / (double)cutW;
                cutH  = Convert.ToInt32(Convert.ToDouble(cutH) * ratio);
                cutW  = oW;
                if (cutH > oH)
                {
                    ratio = (double)oH / (double)cutH;
                    cutW  = Convert.ToInt32((double)cutW * ratio);
                    cutH  = oH;
                }
            }
            else
            {
                if (cutH > oH)
                {
                    ratio = (double)oH / (double)cutH;
                    cutW  = Convert.ToInt32((double)cutW * ratio);
                    cutH  = oH;
                }
            }
            int startX = oW > cutW ? (oW / 2 - cutW / 2) : (cutW / 2 - oW / 2);
            int startY = oH > cutH ? (oH / 2 - cutH / 2) : (cutH / 2 - oH / 2);

            var sKBitmap2 = new SkiaSharp.SKBitmap(saveWidth, saveHeight);
            var sKCanvas  = new SkiaSharp.SKCanvas(sKBitmap2);
            var sKPaint   = new SkiaSharp.SKPaint
            {
                FilterQuality = SkiaSharp.SKFilterQuality.Medium,
                IsAntialias   = true
            };

            sKCanvas.DrawBitmap(
                sKBitmap,
                new SkiaSharp.SKRect
            {
                Location = new SkiaSharp.SKPoint {
                    X = startX, Y = startY
                },
                Size = new SkiaSharp.SKSize {
                    Height = cutH, Width = cutW
                }
            },
                new SkiaSharp.SKRect
            {
                Location = new SkiaSharp.SKPoint {
                    X = 0, Y = 0
                },
                Size = new SkiaSharp.SKSize {
                    Height = saveHeight, Width = saveWidth
                }
            }, sKPaint);
            sKCanvas.Dispose();
            var sKImage2 = SkiaSharp.SKImage.FromBitmap(sKBitmap2);

            sKBitmap2.Dispose();
            var data = sKImage2.Encode(GetImageFormatByPath(path), quality);

            sKImage2.Dispose();
            bytes = data.ToArray();
            data.Dispose();

            return(bytes);
        }