using Domain; using Domain.Interfaces; using Domain.Project; using ImageMagick; using Make3.CommonTypes.Interfaces; using Make3.CommonTypes.Interfaces.Matrices; using Make3.RenderServer.Layers; namespace Make3.RenderServer; public class TestProjectBackgroundService : BackgroundService { private readonly IServiceProvider _serviceProvider; private readonly LayerClients.TestLayer.TestLayerClient _testLaterGrpcClient; public TestProjectBackgroundService(IServiceProvider serviceProvider, LayerClients.TestLayer.TestLayerClient testLaterGrpcClient) { _serviceProvider = serviceProvider; _testLaterGrpcClient = testLaterGrpcClient; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { var dir = @"C:\DOTProjects\ImagesForNewM3"; var image1 = new MagickImage(Path.Combine(dir, "CrystalTest1_2083x2083_16bit.png"));//"Sphere16b-0.png")); var image2 = new MagickImage(Path.Combine(dir, "Crystal_Mask_2083x2083.png")); var image3 = new MagickImage(Path.Combine(dir, "AMask.png")); using var scope = _serviceProvider.CreateScope(); var matrixAbstractFactory = scope.ServiceProvider.GetRequiredService(); var project = new Project { Id = Guid.NewGuid(), HardwareSettings = new HardwareSettings { Ppu = 76.8d, UnitSize = 12, IlluminationLevels = new IlluminationLevels(14, 110, 222), MatrixResolution = new Resolution(1920, 1080), FrameResolution = new Resolution(1536, 1024), FrameSize = new Size(240, 160, SizeUnit.um), }, Height = Convert.ToUInt32(image1.Width), Width = Convert.ToUInt32(image1.Height), }; project.Layers = [ new TestLayer(_testLaterGrpcClient, matrixAbstractFactory) { Order = 0, Image = image1, Mask = ConvertImageToMask(matrixAbstractFactory, image2), HologramWidth = 25.0, HologramHeight = 25.0, HardwareSettings = project.HardwareSettings, OpticalSchema = OpticalSchema.Sp11, InvertMask = false, DifractionAngle = 33.0, PosterizeResult = false, InvertProfile = false, InvertHorizontalAngle = false, DirectAngle = 90.0, AngleOfView = 180.0, ObjectAngle = 80.0,//90.0 + 10,//35, HorizontalRoughness = 0.0, VerticalRoughness = 0.0, }, new TestLayer(_testLaterGrpcClient, matrixAbstractFactory) { Order = 1, Image = image2, Mask = ConvertImageToMask(matrixAbstractFactory, image3), InvertMask = false, OpticalSchema = OpticalSchema.Sp11, }, ]; var renderManager = scope.ServiceProvider.GetRequiredService(); var renderId = await renderManager.StartRender(project); } private IBinaryMask ConvertImageToMask(IMatrixAbstractFactory matrixAbstractFactory, MagickImage image) { var binaryMaskFactory = (IBinaryMaskFactory)matrixAbstractFactory.GetFactory(); var result = binaryMaskFactory.Create((int)image.Width, (int)image.Height, 0); using var pixels = image.GetPixels(); // for (uint y = 0; y < image.Height; y++) // { // for (uint x = 0; x < image.Width; x++) // { // var pixel = image.GetPixels().GetPixel((int)x, (int)y); // var red = pixel.ToColor()?.R ?? 0; // // var blue = pixel.ToColor()?.B ?? 0; // // var green = pixel.ToColor()?.G ?? 0; // var intensity = red;// + blue + green; // if (intensity == 0) // { // result.MakeOpaque(x, y); // } // } // } /// 13 sec - 3 Ch 10sec - 1 ch for (int y = 0; y < image.Height; y++) { for (int x = 0; x < image.Width; x++) { var intensity = pixels.GetPixel(x, y).ToColor().R; //+ pixels.GetPixel(x, y).ToColor().G + pixels.GetPixel(x, y).ToColor().B; if (intensity == 0) { result.MakeOpaque(x, y); } } } /// 13sec - 3ch, 5 sec - 1 ch var p = result.GetBlackCellsPercentage(); return result; } }