Make3.Renderer/Make3.RenderServer/TestProjectBackgroundService.cs
2025-06-28 03:00:25 +03:00

121 lines
4.6 KiB
C#

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<IMatrixAbstractFactory>();
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<IRenderManager>();
var renderId = await renderManager.StartRender(project);
}
private IBinaryMask ConvertImageToMask(IMatrixAbstractFactory matrixAbstractFactory, MagickImage image)
{
var binaryMaskFactory = (IBinaryMaskFactory)matrixAbstractFactory.GetFactory<bool>();
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;
}
}