コード例 #1
0
        private static byte[] StreamToBase64Bytes(SKDynamicMemoryWStream mstream)
        {
            var str = mstream.DetachAsStream();
            var bts = new byte[str.Length];

            str.Read(bts, str.Length);
            return(bts);
        }
コード例 #2
0
        private static string StreamToBase64String(SKDynamicMemoryWStream mstream)
        {
            var str = mstream.DetachAsStream();
            var bts = new byte[str.Length];

            str.Read(bts, str.Length);
            return(Convert.ToBase64String(bts));
        }
コード例 #3
0
ファイル: SKDocumentTest.cs プロジェクト: ywscr/SkiaSharp
            static SKDocument CreateDocument(out IntPtr streamHandle)
            {
                var stream = new SKDynamicMemoryWStream();

                streamHandle = stream.Handle;

                return(SKDocument.CreatePdf(stream, new SKDocumentPdfMetadata()));
            }
コード例 #4
0
 public static byte[] WebpToPng(byte[] webpData)
 {
     using (var origBmp = SKBitmap.Decode(webpData))
         using (var stream = new SKDynamicMemoryWStream())
         {
             origBmp.Encode(stream, SKEncodedImageFormat.Png, 100);
             return(stream.DetachAsData().ToArray());
         }
 }
コード例 #5
0
 public byte[] Save()
 {
     using (var strm = new SKDynamicMemoryWStream())
     {
         SaveToStream(strm);
         var data = strm.CopyToData();
         return(data.ToArray());
     }
 }
コード例 #6
0
 private byte[] Convert(byte[] orig, SKEncodedImageFormat format)
 {
     using (var origBmp = SKBitmap.Decode(orig))
         using (var stream = new SKDynamicMemoryWStream())
         {
             origBmp.Encode(stream, format, 100);
             return(stream.DetachAsData().ToArray());
         }
 }
コード例 #7
0
        public string GetThumbnail(SKBitmap image, int width, int height)
        {
            using (var scaledImage = ResizeImage(image, width, height))
            {
                SKBitmap.Resize(scaledImage, image, resizeMethod);

                using (var memoryStream = new SKDynamicMemoryWStream())
                {
                    scaledImage.Encode(memoryStream, SKEncodedImageFormat.Jpeg, quality);
                    return(Convert.ToBase64String(memoryStream.DetachAsData().ToArray()));
                }
            }
        }
コード例 #8
0
        public void ManagedStreamIsNotCollectedPrematurely()
        {
            using (var document = CreateDocument(out var handle))
            {
                var paintList = new List <SKPaint>();

                for (var index = 0; index < 10; index++)
                {
                    var fontStream = File.OpenRead(Path.Combine(PathToFonts, "Roboto2-Regular_NoEmbed.ttf"));
                    var typeface   = SKTypeface.FromStream(fontStream);

                    var paint = new SKPaint
                    {
                        Typeface = typeface
                    };
                    paintList.Add(paint);
                }

                using (var pageCanvas = document.BeginPage(792, 842))
                {
                    foreach (var paint in paintList)
                    {
                        for (var i = 0; i < 100; i++)
                        {
                            pageCanvas.DrawText("Text", 0, 5 * i, paint);
                        }
                    }

                    document.EndPage();
                }

                CollectGarbage();

                Assert.True(SKObject.GetInstance <SKDynamicMemoryWStream>(handle, out _));

                document.Close();
            }

            SKDocument CreateDocument(out IntPtr streamHandle)
            {
                var stream = new SKDynamicMemoryWStream();

                streamHandle = stream.Handle;

                return(SKDocument.CreatePdf(stream, new SKDocumentPdfMetadata()));
            }
        }
コード例 #9
0
        public static (byte[] result, string error) BinaryCutCompress(byte[] base64Image, double percent, int?minWidth = null, int?maxWidth = null)
        {
            try {
                using (var bitmap = SKBitmap.Decode(base64Image)) {
                    if (bitmap == null)
                    {
                        return(null, "cut - base64Image is null.");
                    }

                    if (minWidth != null && bitmap.Width < minWidth)
                    {
                        percent = 1;
                    }

                    var isWide = bitmap.Width > bitmap.Height;
                    var num    = isWide ? bitmap.Height : bitmap.Width;

                    var p_num = 1.0;
                    if (maxWidth != null && bitmap.Width > maxWidth)
                    {
                        p_num = 1 * (maxWidth.GetValueOrDefault() / (double)bitmap.Width);
                    }

                    var pad    = ((isWide ? bitmap.Width : bitmap.Height) - num) / 2;
                    var ex_num = (int)(p_num * num);
                    using (var newBitmap = new SKBitmap(ex_num, ex_num)) {
                        try {
                            using (var canvas = new SKCanvas(newBitmap)) {
                                canvas.Scale((float)p_num);
                                canvas.DrawBitmap(bitmap, isWide ? -pad : 0, isWide ? 0 : -pad);
                            }
                            using (var mstream = new SKDynamicMemoryWStream())
                                if (newBitmap.Encode(mstream, SKEncodedImageFormat.Jpeg, (int)(100 * (percent > 1 ? 1 : percent))))
                                {
                                    return(StreamToBase64Bytes(mstream), null);
                                }
                            return(null, "cut - encode picture failed : Encode action failed.");
                        } catch (Exception e) {
                            return(null, "cut - draw canvas failed : " + e.Message);
                        }
                    }
                }
            } catch (Exception e) {
                return(null, "cut - draw picture failed : " + e.Message);
            }
        }
コード例 #10
0
        private Response RenderMap(dynamic parameters)
        {
            var gameServer = this.servers.OfType <IGameServer>().FirstOrDefault(s => s.Id == (byte)parameters.serverId);

            var map = gameServer?.ServerInfo.Maps.FirstOrDefault(m => m.MapNumber == (short)parameters.mapId);

            if (map == null)
            {
                Log.Warn($"requested map not available. map number: {parameters.mapId}; server id: {parameters.serverId}");
                return(null);
            }

            var terrain = new GameMapTerrain(map.MapName, map.TerrainData);

            using (var bitmap = new SkiaSharp.SKBitmap(0x100, 0x100))
            {
                for (int y = 0; y < 0x100; y++)
                {
                    for (int x = 0; x < 0x100; x++)
                    {
                        var color = SKColors.Black;
                        if (terrain.SafezoneMap[y, x])
                        {
                            color = SKColors.Gray;
                        }
                        else if (terrain.WalkMap[y, x])
                        {
                            color = SKColors.SpringGreen;
                        }

                        bitmap.SetPixel(x, y, color);
                    }
                }

                using (var memoryStream = new SKDynamicMemoryWStream())
                {
                    if (SKPixmap.Encode(memoryStream, bitmap, SKEncodedImageFormat.Png, 100))
                    {
                        return(this.Response.FromStream(memoryStream.DetachAsData().AsStream, "image/png"));
                    }
                }

                return(null);
            }
        }
コード例 #11
0
        private Result GetImagePart(Mnemonic expression, IRuntime runtime)
        {
            if (
                runtime.GetVariable("arrayOfBinaryData").Get(runtime) is String arrayImage &&
                runtime.GetVariable("left").Get(runtime) is Number a &&
                runtime.GetVariable("top").Get(runtime) is Number b &&
                runtime.GetVariable("right").Get(runtime) is Number c &&
                runtime.GetVariable("bottom").Get(runtime) is Number d
                )
            {
                var binaryData =
                    Convert.FromBase64String(arrayImage.Value);

                //arrayImage
                //.Select(e => e as Number)
                //.Select(n => n.ValueAsByte)
                //.ToArray();
                var resourceBitmap = SKBitmap.Decode(binaryData);

                var bmp = new SKBitmap();
                resourceBitmap.ExtractSubset(bmp,
                                             new SKRectI(a.ValueAsInt, b.ValueAsInt, c.ValueAsInt, d.ValueAsInt));

                SKDynamicMemoryWStream ms = new SKDynamicMemoryWStream();
                var data = bmp.Encode(SKEncodedImageFormat.Png, 100);

                var subimage = Convert.ToBase64String(data.ToArray());
                //LoplaList loplaList = new LoplaList();

                //foreach(var dbyte in data.ToArray())
                //{
                //    loplaList.Add(new Number(dbyte));
                //}

                //return new Result(loplaList);
                return(new Result(new String(subimage)));
            }

            return(new Result());
        }
コード例 #12
0
ファイル: LiveMapController.cs プロジェクト: xzplays/OpenMU
        private Stream RenderMap(IGameMapInfo map)
        {
            var terrain = new GameMapTerrain(map.MapName, map.TerrainData);

            using (var bitmap = new SkiaSharp.SKBitmap(0x100, 0x100))
            {
                for (int y = 0; y < 0x100; y++)
                {
                    for (int x = 0; x < 0x100; x++)
                    {
                        var color = SKColors.Black;
                        if (terrain.SafezoneMap[y, x])
                        {
                            color = SKColors.Gray;
                        }
                        else if (terrain.WalkMap[y, x])
                        {
                            color = SKColors.SpringGreen;
                        }
                        else
                        {
                            // we use the default color.
                        }

                        bitmap.SetPixel(x, y, color);
                    }
                }

                using (var memoryStream = new SKDynamicMemoryWStream())
                {
                    if (SKPixmap.Encode(memoryStream, bitmap, SKEncodedImageFormat.Png, 100))
                    {
                        return(memoryStream.DetachAsData().AsStream());
                    }
                }

                return(null);
            }
        }
コード例 #13
0
        public void StreamIsNotCollectedPrematurely()
        {
            VerifyImmediateFinalizers();

            DoWork(out var handle);

            CollectGarbage();

            Assert.False(SKObject.GetInstance <SKDynamicMemoryWStream>(handle, out _));

            void DoWork(out IntPtr streamHandle)
            {
                using (var document = CreateDocument(out streamHandle))
                {
                    using (var pageCanvas = document.BeginPage(792, 842))
                    {
                        document.EndPage();
                    }

                    CollectGarbage();

                    Assert.True(SKObject.GetInstance <SKDynamicMemoryWStream>(handle, out _));

                    document.Close();
                }

                Assert.True(SKObject.GetInstance <SKDynamicMemoryWStream>(handle, out _));
            }

            SKDocument CreateDocument(out IntPtr streamHandle)
            {
                var stream = new SKDynamicMemoryWStream();

                streamHandle = stream.Handle;

                return(SKDocument.CreatePdf(stream, new SKDocumentPdfMetadata()));
            }
        }
コード例 #14
0
 public static (byte[] result, string error) BinaryCompress(byte[] base64Image, double percent, int?minWidth = null)
 {
     try {
         using (var bitmap = SKBitmap.Decode(base64Image)) {
             if (bitmap == null)
             {
                 return(null, "base64Image is null.");
             }
             if (minWidth != null && bitmap.Width < minWidth)
             {
                 percent = 1;
             }
             using (var mstream = new SKDynamicMemoryWStream())  // Compress Image
                 if (bitmap.Encode(mstream, SKEncodedImageFormat.Jpeg, (int)(100 * (percent > 1 ? 1 : percent))))
                 {
                     return(StreamToBase64Bytes(mstream), null);
                 }
             return(null, "encode picture failed : Encode action failed.");
         }
     } catch (Exception e) {
         return(null, "draw picture failed : " + e.Message);
     }
 }
コード例 #15
0
        public void ManagedStreamIsNotCollectedPrematurely()
        {
            using (var stream = new SKDynamicMemoryWStream())
                using (SKDocument document = SKDocument.CreatePdf(stream, new SKDocumentPdfMetadata()))
                {
                    var paintList = new List <SKPaint>();

                    for (int index = 0; index < 10; index++)
                    {
                        Stream     fontStream = File.OpenRead(Path.Combine(PathToFonts, "Roboto2-Regular_NoEmbed.ttf"));
                        SKTypeface typeface   = SKTypeface.FromStream(fontStream);

                        SKPaint paint = new SKPaint
                        {
                            Typeface = typeface
                        };
                        paintList.Add(paint);
                    }

                    using (SKCanvas pageCanvas = document.BeginPage(792, 842))
                    {
                        foreach (var paint in paintList)
                        {
                            for (int i = 0; i < 100; i++)
                            {
                                pageCanvas.DrawText("Text", 0, 5 * i, paint);
                            }
                        }

                        document.EndPage();
                    }

                    GC.Collect();
                    document.Close();
                }
        }
コード例 #16
0
        static void Main(string[] args)
        {
            // load some routing data and build a routing network.
            var routerDb = new RouterDb();

            using var stream = File.Open(@"C:\Users\yukik\Downloads\zuid-holland-latest.osm.pbf", FileMode.Open, FileAccess.Read);
            var src = new PBFOsmStreamSource(stream);

            routerDb.LoadOsmData(src, Vehicle.Bicycle); // create the network for Bicycle only.

            // create a router.
            var router = new Router(routerDb);

            // get a profile.
            var profile = Vehicle.Bicycle.Fastest(); // the default OSM Bicycle profile.

            // create a routerpoint from a location.
            // snaps the given location to the nearest routable edge.
            var start = router.Resolve(profile, 52.154820f, 4.479307f);
            var end   = router.Resolve(profile, 52.160942f, 4.495821f);

            // calculate a route.
            var route = router.Calculate(profile, start, end);

            var retList = new List <(float lat, float lon, float time, float distance, string name)>();


            // Create the path
            var path = new SKPath();

            var firstShape = route.Shape[0];

            path.MoveTo(5, 5);

            var strokePaint = new SKPaint
            {
                Style       = SKPaintStyle.Stroke,
                Color       = SKColors.Black,
                StrokeWidth = 1
            };

            int scale = 50000;

            for (int i = 1; i < route.ShapeMeta.Length - 2; i++)
            {
                var meta = route.ShapeMeta[i];

                var strn    = meta.Attributes.TryGetValue("name", out var desc);
                var current = route.Shape[meta.Shape];
                if (meta.Shape > 0 && route.ShapeMeta[i - 1].Attributes.TryGetValue("name", out var v) && v == desc)
                {
                    continue;
                }

                if (route.Shape.Length <= meta.Shape + 1)
                {
                    continue;
                }
                var lat = (current.Latitude - firstShape.Latitude) * scale;
                var lon = (current.Longitude - firstShape.Longitude) * scale;
                retList.Add((lat, lon, meta.Time - retList.LastOrDefault().time, meta.Distance - retList.LastOrDefault().distance, desc));

                path.LineTo(lon, -lat);
            }

            var rect = path.Bounds;
            var translationMatrix = SKMatrix.CreateTranslation(Math.Abs(path.Bounds.Left) + 20, Math.Abs(path.Bounds.Top) + 20);

            path.Transform(translationMatrix);
            rect.Inflate(100, 10);
            using var outStream = new SKDynamicMemoryWStream();
            var svg = SKSvgCanvas.Create(rect, outStream);


            svg.DrawPath(path, strokePaint);

            foreach (var(lat, lon, time, distance, name) in retList)
            {
                var point = new SKPoint(lon, -lat);

                svg.DrawText($"{name} ({TimeSpan.FromSeconds(time).Humanize()} - {Math.Round(distance)} meter) ", translationMatrix.MapPoint(point), strokePaint);
            }


            var s = outStream.DetachAsData();

            File.WriteAllBytes("test.svg", s.ToArray());

            Console.WriteLine("Hello World!");
        }