コード例 #1
0
 public void Save(Stream stream, PageContainerViewModel container)
 {
     using var wstream = new SKManagedWStream(stream);
     using var canvas  = SKSvgCanvas.Create(SKRect.Create(0, 0, (int)container.Template.Width, (int)container.Template.Height), stream);
     _presenter.Render(canvas, _renderer, null, container, 0, 0);
 }
コード例 #2
0
ファイル: MainWindow.xaml.cs プロジェクト: Core2D/Core2D
        private void UpdateSvg()
        {
            bool exportPresenter = _previewWindow.svgExport.IsChecked == true;
            bool showPrintable = _previewWindow.svgPrintable.IsChecked == true;

            Task.Factory.StartNew(() =>
            {
                try
                {
                    IImageCache ic = _projectEditor.Project;
                    var container = _projectEditor.Project.CurrentContainer;

                    var renderer = new SkiaRenderer(true, 96.0);
                    if (!showPrintable)
                    {
                        renderer.State.DrawShapeState.Flags = ShapeStateFlags.Printable;
                    }
                    renderer.State.ImageCache = _projectEditor.Project;

                    var presenter = exportPresenter ? (ContainerPresenter)new ExportPresenter() : (ContainerPresenter)new EditorPresenter();

                    using (var ms = new MemoryStream())
                    {
                        using (var stream = new SKManagedWStream(ms))
                        {
                            using (var writer = new SKXmlStreamWriter(stream))
                            using (var canvas = SKSvgCanvas.Create(SKRect.Create(0, 0, (int)container.Width, (int)container.Height), writer))
                            {
                                presenter.Render(canvas, renderer, container, 0, 0);
                            }
                            stream.Flush();
                        }

                        var svg = Encoding.ASCII.GetString(ms.GetBuffer(), 0, (int)ms.Length);

                        Dispatcher.Invoke(() =>
                        {
                            _previewWindow.svgText.Text = svg;
                        });
                    }
                }
                catch (Exception) { }
            });
        }
コード例 #3
0
        private async Task <byte[]> GenerateDiagram(CommandContext ctx, IEnumerable <IGrouping <long, Slavereports> > groupedReports, TimeSpan timespan)
        {
            if (groupedReports.Count() > 5)
            {
                throw new ArgumentOutOfRangeException("Maximum allowed number of users in a diagram is 5");
            }

            const int ImageWidth           = 1024;
            const int ImageHeight          = 800;
            const int DiagramSpacingLeft   = 90;           // Spacing on the left of the Y line
            const int DiagramSpacingBottom = 120;          // Spacing below the X line

            SKBitmap bmp = new SKBitmap(ImageWidth, ImageHeight);

            using SKCanvas canvas = new SKCanvas(bmp);

            // Set black background
            canvas.Clear(new SKColor(47, 49, 54));

            // Create all colors and strokes needed later on
            SKPaint diagramPaint = new SKPaint()
            {
                Color       = new SKColor(200, 200, 230),
                StrokeWidth = 3,
                IsAntialias = true,
            };

            SKPaint diagramPaintThicc = new SKPaint()
            {
                Color       = new SKColor(200, 200, 230),
                StrokeWidth = 6,
                IsAntialias = true
            };

            SKPaint textPaint = new SKPaint()
            {
                Color                = new SKColor(200, 200, 230),
                TextSize             = 18f,
                TextAlign            = SKTextAlign.Center,
                IsAntialias          = true,
                IsEmbeddedBitmapText = true
            };

            SKPaint leftTextPaint = new SKPaint()
            {
                Color                = new SKColor(200, 200, 230),
                TextSize             = 18f,
                TextAlign            = SKTextAlign.Right,
                IsAntialias          = true,
                IsEmbeddedBitmapText = true
            };

            // Draw X and Y lines
            canvas.DrawLine(new SKPoint(DiagramSpacingLeft, 0), new SKPoint(DiagramSpacingLeft, ImageHeight), diagramPaint);
            canvas.DrawLine(new SKPoint(0, ImageHeight - DiagramSpacingBottom), new SKPoint(ImageWidth, ImageHeight - DiagramSpacingBottom), diagramPaint);

            const int rows = 8;

            // max and min time of all reports
            var maxTime = groupedReports.Max(g => g.Max(r => r.TimeSpan));
            var minTime = groupedReports.Min(g => g.Min(r => r.TimeSpan));

            var timeDiff                = TimeSpan.FromTicks(maxTime - minTime);
            var individualTime          = TimeSpan.FromTicks(maxTime / rows);
            var individualRowSpacing    = Convert.ToInt32((ImageHeight - DiagramSpacingBottom * 1.4f) / rows);
            var individualColumnSpacing = Convert.ToInt32((ImageWidth - DiagramSpacingLeft * 1.4f) / (timespan.TotalDays + 1));

            for (int i = 1; i <= rows; i++)
            {
                var y = ImageHeight - DiagramSpacingBottom - individualRowSpacing * i;
                canvas.DrawLine(new SKPoint(DiagramSpacingLeft - 10, y), new SKPoint(DiagramSpacingLeft + 10, y), diagramPaintThicc);
                canvas.DrawText((individualTime * i).ToString("hh\\:mm\\:ss"), new SKPoint(DiagramSpacingLeft - 10, y - 10), leftTextPaint);
            }

            var xLineHeight = ImageHeight - DiagramSpacingBottom;

            for (int i = 1; i <= timespan.TotalDays + 2; i++)
            {
                var x = DiagramSpacingLeft + individualColumnSpacing * i;
                canvas.DrawLine(new SKPoint(x, xLineHeight - 10), new SKPoint(x, xLineHeight + 10), diagramPaintThicc);
                canvas.DrawText((DateTime.Now - timespan + TimeSpan.FromDays(1) + TimeSpan.FromDays(i - 1)).ToString("dd.MM."), new SKPoint(x, xLineHeight + 30), textPaint);
            }

            // Create a color for each user
            SKColor[] userColors = new SKColor[]
            {
                new SKColor(36, 123, 160),
                new SKColor(112, 193, 179),
                new SKColor(178, 219, 191),
                new SKColor(243, 255, 189),
                new SKColor(225, 22, 84)
            };

            for (int i = 0; i < groupedReports.Count(); i++)
            {
                var group       = groupedReports.ElementAt(i);
                var color       = userColors[i];
                var colorBright = new SKColor((byte)(color.Red + 100 > 255 ? 255 : color.Red + 100), (byte)(color.Green + 100 > 255 ? 255 : color.Green + 100), (byte)(color.Blue + 100 > 255 ? 255 : color.Blue + 100));

                var paint = new SKPaint()
                {
                    Color                = color,
                    StrokeWidth          = 3,
                    TextSize             = 18f,
                    TextAlign            = SKTextAlign.Center,
                    IsAntialias          = true,
                    IsEmbeddedBitmapText = true
                };

                var paintBright = new SKPaint()
                {
                    Color                = colorBright,
                    StrokeWidth          = 3,
                    TextSize             = 18f,
                    TextAlign            = SKTextAlign.Center,
                    IsAntialias          = true,
                    IsEmbeddedBitmapText = true
                };

                SKPoint lastCoord = SKPoint.Empty;

                var user = await ctx.Client.GetUserAsync(Convert.ToUInt64(group.Key));

                var spacePerUser = (ImageWidth - DiagramSpacingLeft) / 5;

                // Get the avatar
                HttpClient httpClient      = new HttpClient();
                var        userImgResponse = await httpClient.GetAsync(user.AvatarUrl);

                // Only add the user avatar if it can be downloaded
                if (userImgResponse.IsSuccessStatusCode)
                {
                    DiscordMember member = null;
                    try
                    {
                        member = await ctx.Channel.Guild.GetMemberAsync(user.Id);
                    }
                    catch (Exception)
                    { }

                    var antialiasedPaint = new SKPaint()
                    {
                        IsAntialias = true
                    };

                    textPaint.GetFontMetrics(out SKFontMetrics metrics);
                    var textSpacing = Convert.ToInt32(metrics.XMax + (metrics.XMax / 4));

                    var x         = DiagramSpacingLeft + 5 + spacePerUser * i;
                    var y         = ImageHeight - DiagramSpacingBottom + textSpacing;
                    var fullSpace = DiagramSpacingBottom - textSpacing < spacePerUser ? DiagramSpacingBottom : spacePerUser;
                    var halfSpace = fullSpace / 2;

                    var left = halfSpace / 4 * 1;
                    var top  = halfSpace / 4 * 1;
                    var size = halfSpace / 4 * 3;

                    var baseBmp    = new SKBitmap(spacePerUser, fullSpace - Convert.ToInt32(textSpacing));
                    var baseCanvas = new SKCanvas(baseBmp);
                    baseCanvas.Clear(color);

                    var      userImgBmp    = SKBitmap.Decode(await userImgResponse.Content.ReadAsStreamAsync());
                    var      clippedBmp    = new SKBitmap(userImgBmp.Width, userImgBmp.Height);
                    SKCanvas userImgCanvas = new SKCanvas(clippedBmp);
                    userImgCanvas.ClipRoundRect(new SKRoundRect(new SKRect(0, 0, userImgBmp.Width, userImgBmp.Height), 100, 100));
                    userImgCanvas.DrawBitmap(userImgBmp, 0, 0, antialiasedPaint);
                    userImgCanvas.Flush();

                    baseCanvas.DrawBitmap(clippedBmp, new SKRect(left, top, left + size, top + size), antialiasedPaint);

                    SKPaint namePaint = new SKPaint()
                    {
                        Color                = new SKColor(47, 49, 54),
                        TextAlign            = SKTextAlign.Left,
                        TextSize             = 18,
                        IsAntialias          = true,
                        IsEmbeddedBitmapText = true,
                    };

                    DrawTextArea(baseCanvas, namePaint, left * 2 + size, top * 2, spacePerUser - left * 2 + size, 15, member?.Nickname ?? user.Username);

                    canvas.DrawBitmap(baseBmp, new SKPoint(x, y), antialiasedPaint);
                }

                foreach (var report in group)
                {
                    var minDate             = (DateTime.Now - timespan).Date;
                    var maxDate             = (DateTime.Now + TimeSpan.FromDays(1)).Date;
                    var totalSpace          = individualColumnSpacing * (timespan.TotalDays + 1);
                    var percentPointPerTick = (float)totalSpace / (maxDate - minDate).Ticks;
                    var x     = DiagramSpacingLeft + (percentPointPerTick * (report.TimeOfReport - minDate).Ticks);                 //Subtract the time of the report from the mindate, to get the time relative from the beginning of the graph. multiply by percentagepoint of a tick on the graph. add spacing,
                    var y     = ImageHeight - DiagramSpacingBottom - ((ImageHeight - (DiagramSpacingBottom * 1.4f)) / Convert.ToSingle(maxTime) * report.TimeSpan);
                    var coord = new SKPoint(x, y);
                    canvas.DrawCircle(coord, 8, paint);
                    canvas.DrawText(TimeSpan.FromTicks(report.TimeSpan).ToString(), new SKPoint(coord.X, coord.Y - 10), paintBright);
                    //canvas.DrawText(report.TimeOfReport.ToString(), new SKPoint(coord.X, coord.Y + 15), paintBright);

                    if (lastCoord != SKPoint.Empty)
                    {
                        canvas.DrawLine(lastCoord, coord, paint);
                    }

                    lastCoord = coord;
                }
            }

            using var ms = new MemoryStream();
            using SKManagedWStream skStream = new SKManagedWStream(ms);
            if (SKPixmap.Encode(skStream, bmp, SKEncodedImageFormat.Png, 100))
            {
                return(ms.ToArray());
            }

            return(Array.Empty <byte>());
        }
コード例 #4
0
        public byte[] Generate(string content, BarcodeType type, int?width, int?height, int?margin, bool?pure)
        {
            ZXing.BarcodeFormat barcodeFormat;
            switch (type)
            {
            case BarcodeType.AZTEC:
                barcodeFormat = ZXing.BarcodeFormat.AZTEC;
                break;

            case BarcodeType.CODABAR:
                barcodeFormat = ZXing.BarcodeFormat.CODABAR;
                break;

            case BarcodeType.CODE_39:
                barcodeFormat = ZXing.BarcodeFormat.CODE_39;
                break;

            case BarcodeType.CODE_93:
                barcodeFormat = ZXing.BarcodeFormat.CODE_93;
                break;

            case BarcodeType.CODE_128:
                barcodeFormat = ZXing.BarcodeFormat.CODE_128;
                break;

            case BarcodeType.DATA_MATRIX:
                barcodeFormat = ZXing.BarcodeFormat.DATA_MATRIX;
                break;

            case BarcodeType.EAN_8:
                barcodeFormat = ZXing.BarcodeFormat.EAN_8;
                break;

            case BarcodeType.EAN_13:
                barcodeFormat = ZXing.BarcodeFormat.EAN_13;
                break;

            case BarcodeType.ITF:
                barcodeFormat = ZXing.BarcodeFormat.ITF;
                break;

            case BarcodeType.MAXICODE:
                barcodeFormat = ZXing.BarcodeFormat.MAXICODE;
                break;

            case BarcodeType.PDF_417:
                barcodeFormat = ZXing.BarcodeFormat.PDF_417;
                break;

            case BarcodeType.QR_CODE:
                barcodeFormat = ZXing.BarcodeFormat.QR_CODE;
                break;

            case BarcodeType.RSS_14:
                barcodeFormat = ZXing.BarcodeFormat.RSS_14;
                break;

            case BarcodeType.RSS_EXPANDED:
                barcodeFormat = ZXing.BarcodeFormat.RSS_EXPANDED;
                break;

            case BarcodeType.UPC_A:
                barcodeFormat = ZXing.BarcodeFormat.UPC_A;
                break;

            case BarcodeType.UPC_E:
                barcodeFormat = ZXing.BarcodeFormat.UPC_E;
                break;

            case BarcodeType.UPC_EAN_EXTENSION:
                barcodeFormat = ZXing.BarcodeFormat.UPC_EAN_EXTENSION;
                break;

            case BarcodeType.MSI:
                barcodeFormat = ZXing.BarcodeFormat.MSI;
                break;

            case BarcodeType.PLESSEY:
                barcodeFormat = ZXing.BarcodeFormat.PLESSEY;
                break;

            case BarcodeType.IMB:
                barcodeFormat = ZXing.BarcodeFormat.IMB;
                break;

            default:
                throw new ArgumentException();
            }

            var barcodeWriter = new ZXing.SkiaSharp.BarcodeWriter
            {
                Format = barcodeFormat,
            };

            if (width.HasValue || height.HasValue || margin.HasValue)
            {
                barcodeWriter.Options = new EncodingOptions();
                if (width.HasValue)
                {
                    barcodeWriter.Options.Width = width.Value;
                }

                if (height.HasValue)
                {
                    barcodeWriter.Options.Height = height.Value;
                }

                if (margin.HasValue)
                {
                    barcodeWriter.Options.Margin = margin.Value;
                }

                if (pure.HasValue)
                {
                    barcodeWriter.Options.PureBarcode = pure.Value;
                }
            }

            using (var image = barcodeWriter.Write(content))
            {
                using (var memStream = new MemoryStream())
                {
                    using (var wstream = new SKManagedWStream(memStream))
                    {
                        if (image.Encode(wstream, SKEncodedImageFormat.Png, 100))
                        {
                            return(memStream.ToArray());
                        }

                        return(null);
                    }
                }
            }
        }
コード例 #5
0
ファイル: MainPage.xaml.cs プロジェクト: DharMahn/xTracer
        async void OnCanvasViewTapped(object sender, EventArgs e)
        {
            List <string> scenes = new List <string>();
            string        action = await DisplayActionSheet("What to do?", null, null, "Load Scene", "Save Scene", "Delete Scene", "Render Scene");

            if (action == "Load Scene")
            {
                var sceneDescs = db.Table <SceneDescription>();
                foreach (var item in sceneDescs)
                {
                    scenes.Add(item.sceneName);
                }
                string whatToLoad = await DisplayActionSheet("Which scene to load?", null, null, scenes.ToArray());

                if (whatToLoad != null)
                {
                    sc.LoadScene(whatToLoad);
                    sc.SetMainCamera(GetCameraFromEntry());
                    LoadShapesIntoOC();
                    LoadLightsIntoOC();
                }
            }
            else if (action == "Save Scene")
            {
                string sceneName = await DisplayPromptAsync("Save Scene", "Scene name:");

                sc.SaveScene(sceneName);
            }
            else if (action == "Delete Scene")
            {
                var sceneDescs = db.Table <SceneDescription>();
                foreach (var item in sceneDescs)
                {
                    scenes.Add(item.sceneName);
                }
                string whatToDelete = await DisplayActionSheet("Which scene to load?", null, null, scenes.ToArray());

                if (whatToDelete != null)
                {
                    sc.DeleteScene(whatToDelete);
                }
            }
            else if (action == "Render Scene")
            {
                bigImage = new SKBitmap(1024, 1024);
                sc.mainCamera.finishedRendering = false;
                sc.mainCamera.Render(bigImage);
                Toast.MakeText(Android.App.Application.Context, "Rendering, please wait! (it may take a loooong time)", ToastLength.Long).Show();
                while (!sc.mainCamera.finishedRendering)
                {
                    Console.WriteLine("still busy");
                    await Task.Delay(25);
                }
                try
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        using (SKManagedWStream wstream = new SKManagedWStream(ms))
                        {
                            bigImage.Encode(wstream, SKEncodedImageFormat.Png, 100);
                            byte[] data   = ms.ToArray();
                            var    status = await CrossPermissions.Current.CheckPermissionStatusAsync <StoragePermission>();

                            if (status != Plugin.Permissions.Abstractions.PermissionStatus.Granted)
                            {
                                await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Plugin.Permissions.Abstractions.Permission.Storage);

                                status = await CrossPermissions.Current.RequestPermissionAsync <StoragePermission>();
                            }
                            if (status == Plugin.Permissions.Abstractions.PermissionStatus.Granted)
                            {
                                string filename = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".png";
                                if (!Directory.Exists(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/DCIM/xTracer"))
                                {
                                    Directory.CreateDirectory(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/DCIM/xTracer");
                                }
                                if (File.Exists(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/DCIM/xTracer/" + filename))
                                {
                                    File.Delete(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/DCIM/xTracer/" + filename);
                                }

                                using (var stream = File.Create(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/DCIM/xTracer/" + filename))
                                {
                                    stream.Write(data, 0, data.Length);
                                    Toast.MakeText(Android.App.Application.Context, "Finished rendering!, saved to " + Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/DCIM/xTracer/" + filename, ToastLength.Long).Show();
                                }
                            }
                        }
                    }
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }
コード例 #6
0
        private async void ImageButton_Clicked_2(object sender, EventArgs e)
        {
            if (loading.Count == 0)
            {
                isRunning = true;
                string fileName = await DisplayPromptAsync("Save", "What would you like the file name to be?", "OK", "Cancel", "File Name");


                //Gives option to save file with a custom name on photo gallery

                if (fileName != null && fileName != "" && fileName != "Cancel" && fileName != "OK")
                {
                    option = await DisplayActionSheet("Quality", null, null, "Custom", "Max High", "Ultra High", "High", "Medium", "Low", "Very Low");

                    Option_Check();

                    cancel = false;

                    canvasImage.IsVisible     = true;
                    canvasImageFast.IsVisible = false;

                    loading.Add("Loading . . . ");

                    double ri;
                    double ci;
                    double l;

                    string downloadMacro;
                    string downloadMicro;

                    if (AdvancedModes.createAdvanced)
                    {
                        downloadMacro = AdvancedModes.macroInput;
                        downloadMicro = AdvancedModes.microInput;

                        ri = AdvancedModes.realInput;
                        ci = AdvancedModes.complexInput;
                        l  = AdvancedModes.lengthInput;
                    }
                    else
                    {
                        downloadMacro = selectedColor;
                        downloadMicro = selecterColorMicro;

                        if (item <= 12)
                        {
                            ri = varList1[item];
                            ci = varList2[item];
                            l  = varList3[item];
                        }
                        else
                        {
                            ri = SavedFractals[item - 13].SavedReal;
                            ci = SavedFractals[item - 13].SavedComplex;
                            l  = SavedFractals[item - 13].SavedLength;
                        }
                    }


                    //Making 2x2 array with size height export and width export
                    Complex complix;
                    Pixel[,] picture = new Pixel[heightExport, widthExport];
                    int a;
                    int b;

                    //Setting format to Jpeg

                    SKEncodedImageFormat imageFormat = SKEncodedImageFormat.Jpeg;
                    int quality = 100;

                    //For loop with calculations, every column calulated between loading changes
                    //i goes up by the length value to make proportional
                    for (double i = ri * heightExport; i < (ri + l) * heightExport; i += l)
                    {
                        if (cancel)
                        {
                            break;
                        }
                        Loading();

                        for (double j = ci * widthExport; j < (ci + l) * widthExport; j += l)
                        {
                            if (cancel)
                            {
                                break;
                            }
                            //setting shift of and position
                            a = (int)((i - ri * heightExport) / l);
                            b = (int)((j - ci * widthExport) / l);

                            complix = new Complex((i - (14 * heightExport / 20.0)) / (widthExport / 3.0), (j - (widthExport / 2.0)) / (heightExport / 3.0 * widthExport / heightExport));

                            int onoff = (int)(Iterate(complix) * 255);

                            updatePixelInputs(downloadMacro, downloadMicro, onoff);

                            picture[a, b] = new Pixel(intInput1, intInput2, intInput3);

                            //Sets individual pixels
                            if (picture[a, b] == null)
                            {
                                picture[a, b] = new Pixel(0, 0, 0);

                                SKColor colorPixelNull = new SKColor((byte)picture[a, b].GetRed(), (byte)picture[a, b].GetGreen(), (byte)picture[a, b].GetBlue());

                                bitmap.SetPixel(a, b, colorPixelNull);
                            }
                            else
                            {
                                SKColor colorPixel = new SKColor((byte)picture[a, b].GetRed(), (byte)picture[a, b].GetGreen(), (byte)picture[a, b].GetBlue());

                                bitmap.SetPixel(a, b, colorPixel);
                            }
                        }

                        //Saves image every column
                        using (MemoryStream memStream = new MemoryStream())
                            using (SKManagedWStream wstream = new SKManagedWStream(memStream))
                            {
                                bitmap.Encode(wstream, imageFormat, quality);

                                byte[] data = memStream.ToArray();

                                if (data != null && data.Length != 0)
                                {
                                    await DependencyService.Get <IPhotoLibrary>().
                                    SavePhotoAsync(data, "SaveFileFormats", fileName + ".Jpeg");
                                }
                            }
                    }

                    cancel = false;
                }
                heightExport = (int)(Settings.QualityOptions[0].Quality);
                widthExport  = (int)(Settings.QualityOptions[0].Quality);
                if (loading.Count != 0)
                {
                    loading.RemoveAt(0);
                }
                isRunning = false;
            }
        }
コード例 #7
0
        public async void GenerateMandelbrotZoom(double ri, double ci, double l, string macroColor, string microColor)
        {
            if (loading.Count == 0)
            {
                isRunning = true;
                cancel    = false;

                canvasImage.IsVisible = false;

                loading.Add("Loading . . . ");

                bitmapFast = new SKBitmap(widthExport, heightExport, true);

                canvasImageFast.IsVisible = true;

                cancel = false;
                //Making 2x2 array with size height export and width export
                Complex complix;
                Pixel[,] picture = new Pixel[widthExport, heightExport];
                int a;
                int b;

                //Setting format to Jpeg

                SKEncodedImageFormat imageFormat = SKEncodedImageFormat.Jpeg;
                int quality = 100;

                //For loop with calculations, every column calulated between loading changes
                //i goes up by the length value to make proportional

                for (double i = ri * widthExport; i < (ri + l) * widthExport; i += l)
                {
                    if (cancel)
                    {
                        break;
                    }
                    for (double j = ci * heightExport; j < (ci + l) * heightExport; j += l)
                    {
                        if (cancel)
                        {
                            break;
                        }
                        //setting shift of and position
                        a = (int)((i - ri * widthExport) / l);
                        b = (int)((j - ci * heightExport) / l);

                        complix = new Complex((i - (14 * heightExport / 20.0)) / (widthExport / 3.0), (j - (widthExport / 2.0)) / (heightExport / 3.0 * widthExport / heightExport));

                        int onoff = (int)(Iterate(complix) * 255);

                        updatePixelInputs(macroColor, microColor, onoff);

                        picture[a, b] = new Pixel(intInput1, intInput2, intInput3);

                        //Sets individual pixels
                        if (picture[a, b] == null)
                        {
                            picture[a, b] = new Pixel(0, 0, 0);

                            SKColor colorPixelNull = new SKColor((byte)picture[a, b].GetRed(), (byte)picture[a, b].GetGreen(), (byte)picture[a, b].GetBlue());

                            bitmapFast.SetPixel(a, b, colorPixelNull);
                        }
                        else
                        {
                            SKColor colorPixel = new SKColor((byte)picture[a, b].GetRed(), (byte)picture[a, b].GetGreen(), (byte)picture[a, b].GetBlue());

                            bitmapFast.SetPixel(a, b, colorPixel);
                        }
                    }
                    //Saves image every column
                    using (MemoryStream memStream = new MemoryStream())
                        using (SKManagedWStream wstream = new SKManagedWStream(memStream))
                        {
                            bitmapFast.Encode(wstream, imageFormat, quality);

                            byte[] data = memStream.ToArray();

                            if (data != null && data.Length != 0)
                            {
                                string fileName = null;
                                await DependencyService.Get <IPhotoLibrary>().
                                SavePhotoAsync(data, "SaveFileFormats", fileName + ".Jpeg");
                            }
                        }
                    Loading();
                }
                loading.RemoveAt(0);
                isRunning = false;
            }
        }
コード例 #8
0
        public byte[] DrawAreaAtSize(ImageStats stats, List <CompletePaintOp> paintOps)
        {
            //This is the new core drawing function. Once the paint operations have been created, I just draw them here.
            //baseline image data stuff
            SKBitmap bitmap = new SKBitmap(stats.imageSizeX, stats.imageSizeY, SKColorType.Rgba8888, SKAlphaType.Premul);
            SKCanvas canvas = new SKCanvas(bitmap);

            canvas.Clear(eraser.Color);
            canvas.Scale(1, -1, stats.imageSizeX / 2, stats.imageSizeY / 2);
            SKPaint paint = new SKPaint();

            foreach (var w in paintOps.OrderByDescending(p => p.paintOp.LayerId).ThenByDescending(p => p.areaSize))
            {
                paint = cachedPaints[w.paintOp.Id]; //SetPaintForTPP(w.paintOp); // w.paintOp.paint;

                if (w.paintOp.FromTag)              //FromTag is for when you are saving color data directly to each element, instead of tying it to a styleset.
                {
                    paint.Color = SKColor.Parse(w.tagValue);
                }

                if (w.paintOp.Randomize) //To randomize the color on every Draw call.
                {
                    paint.Color = new SKColor((byte)r.Next(0, 255), (byte)r.Next(0, 255), (byte)r.Next(0, 255), 99);
                }

                paint.StrokeWidth = (float)w.lineWidthPixels;
                var path = new SKPath();
                switch (w.elementGeometry.GeometryType)
                {
                case "Polygon":
                    var p = w.elementGeometry as Polygon;
                    //if (p.Envelope.Length < (stats.degreesPerPixelX * 4)) //This poly's perimeter is too small to draw
                    //continue;
                    path.AddPoly(PolygonToSKPoints(p.ExteriorRing, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY));
                    foreach (var ir in p.Holes)
                    {
                        //if (ir.Envelope.Length < (w.lineWidth * 4)) //This poly's perimeter is less than 2x2 pixels in size.
                        //continue;
                        path.AddPoly(PolygonToSKPoints(ir, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY));
                    }
                    canvas.DrawPath(path, paint);
                    break;

                case "MultiPolygon":
                    foreach (var p2 in ((MultiPolygon)w.elementGeometry).Geometries)
                    {
                        //if (p2.Envelope.Length < (stats.degreesPerPixelX * 4)) //This poly's perimeter is too small to draw
                        //continue;
                        var p2p = p2 as Polygon;
                        path.AddPoly(PolygonToSKPoints(p2p.ExteriorRing, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY));
                        foreach (var ir in p2p.Holes)
                        {
                            //if (ir.Envelope.Length < (stats.degreesPerPixelX * 4)) //This poly's perimeter is too small to draw
                            // continue;
                            path.AddPoly(PolygonToSKPoints(ir, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY));
                        }
                        canvas.DrawPath(path, paint);
                    }
                    break;

                case "LineString":
                    var firstPoint = w.elementGeometry.Coordinates.First();
                    var lastPoint  = w.elementGeometry.Coordinates.Last();
                    var points     = PolygonToSKPoints(w.elementGeometry, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY);
                    if (firstPoint.Equals(lastPoint))
                    {
                        //This is a closed shape. Check to see if it's supposed to be filled in.
                        if (paint.Style == SKPaintStyle.Fill)
                        {
                            path.AddPoly(points);
                            canvas.DrawPath(path, paint);
                            continue;
                        }
                    }
                    //if (w.lineWidth < 1) //Don't draw lines we can't see.
                    //continue;
                    for (var line = 0; line < points.Length - 1; line++)
                    {
                        canvas.DrawLine(points[line], points[line + 1], paint);
                    }
                    break;

                case "MultiLineString":
                    //if (w.lineWidth < 1) //Don't draw lines we can't see.
                    //continue;
                    foreach (var p3 in ((MultiLineString)w.elementGeometry).Geometries)
                    {
                        var points2 = PolygonToSKPoints(p3, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY);
                        for (var line = 0; line < points2.Length - 1; line++)
                        {
                            canvas.DrawLine(points2[line], points2[line + 1], paint);
                        }
                    }
                    break;

                case "Point":
                    var convertedPoint = PolygonToSKPoints(w.elementGeometry, stats.area, stats.degreesPerPixelX, stats.degreesPerPixelY);
                    //If this type has an icon, use it. Otherwise draw a circle in that type's color.
                    if (!string.IsNullOrEmpty(w.paintOp.FileName))
                    {
                        SKBitmap icon = SKBitmap.Decode(TagParser.cachedBitmaps[w.paintOp.FileName]);     //TODO optimize by making icons in Initialize.
                        canvas.DrawBitmap(icon, convertedPoint[0]);
                    }
                    else
                    {
                        var circleRadius = (float)(ConstantValues.resolutionCell10 / stats.degreesPerPixelX / 2);     //I want points to be drawn as 1 Cell10 in diameter.
                        canvas.DrawCircle(convertedPoint[0], circleRadius, paint);
                        //TODO re-add outline paint to this DLL not TagParser.
                        //canvas.DrawCircle(convertedPoint[0], circleRadius, TagParser.outlinePaint);
                    }
                    break;

                default:
                    Log.WriteLog("Unknown geometry type found, not drawn.");
                    break;
                }
            }
            //}

            var ms   = new MemoryStream();
            var skms = new SKManagedWStream(ms);

            bitmap.Encode(skms, SKEncodedImageFormat.Png, 100);
            var results = ms.ToArray();

            skms.Dispose(); ms.Close(); ms.Dispose();
            return(results);
        }