NodePipeline/NodePipeline.Application/Nodes/MaskApplyNode.cs
2026-01-02 20:55:25 +03:00

56 lines
1.5 KiB
C#

using System.ComponentModel.DataAnnotations;
using NodePipeline.Abstractions.Attributes;
using NodePipeline.Abstractions.Interfaces.Nodes;
using NodePipeline.Abstractions.Models;
namespace NodePipeline.Application.Nodes;
public class MaskApplyNode : INode
{
[NodeField(FieldDirection.Input)]
[Required]
public NodeField<ImageBuffer> InputImage { get; set; } = null!;
[NodeField(FieldDirection.Input)]
[Required]
public NodeField<ImageBuffer> Mask { get; set; } = null!;
[NodeField(FieldDirection.Input)]
[DisallowNullableOutput]
[Required]
public NodeField<bool> HasMask { get; set; } = null!;
[NodeField(FieldDirection.Parameter)]
public NodeField<MaskMode> Mode { get; set; } = null!; // "Subtract" или "Overlay"
[NodeField(FieldDirection.Output)] public NodeField<ImageBuffer> OutputImage { get; set; } = null!;
public void Execute()
{
var img = InputImage.Value;
if (!HasMask.Value)
{
OutputImage.Value = InputImage.Value;
return;
}
var mask = Mask.Value;
var result = new ImageBuffer(img.Width, img.Height);
for (var i = 0; i < img.Pixels.Length; i++)
{
var v = Mode.Value == MaskMode.Subtract
? (byte)Math.Max(0, img.Pixels[i] - mask.Pixels[i])
: (byte)Math.Min(255, img.Pixels[i] + mask.Pixels[i]);
result.Pixels[i] = v;
}
OutputImage.Value = result;
}
}
public enum MaskMode
{
Subtract,
Overlay
}