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"); } } }
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); }
/// <summary> /// Copies the image to the specified bitmapdata instance /// </summary> public SkiaSharp.SKBitmap ToSKBitmap() { if (Updated || skBitmap == null) { skBitmap = ToImage().ToSKBitmap(); } return(skBitmap); }
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); }
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}"); } }
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()); }
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); }
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); } }
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 }
/// <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 }
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; } }
///////////////////////////////////////////////////////////////////////////////////// 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; //} }
//######################################################################################## #region Constructor / Dispose / Finalizer /// <summary> /// Constructor with the SKBitmap /// </summary> /// <param name="bitmap"></param> public SKBitmapRawImage(SkiaSharp.SKBitmap bitmap) { Bitmap = bitmap; }
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 }
public void SetIcon(SkiaSharp.SKBitmap icon) { // NO OP on OSX }
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); }
public static MemoryBitmap.IDisposableSource UsingMemoryBitmap(this SkiaSharp.SKBitmap bmp) { return(new Adapters.SkiaMemoryManager(bmp)); }
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); }
/// <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); }
/// <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 }
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); }