public void TestBrightnessContrastSaturation() { System.Drawing.Bitmap image = new System.Drawing.Bitmap("..\\..\\..\\..\\resources\\papagei.png"); YuvKA.VideoModel.Size size = new YuvKA.VideoModel.Size(image.Width, image.Height); Frame[] inputFrames = { new Frame(size) }; BrightnessContrastSaturationNode bcsNode = new BrightnessContrastSaturationNode(); // Copy RGB content to the input frame for (int y = 0; y < size.Height; y++) { for (int x = 0; x < size.Width; ++x) { inputFrames[0][x, y] = new Rgb(image.GetPixel(x, y).R, image.GetPixel(x, y).G, image.GetPixel(x, y).B); } } bcsNode.Contrast = 0.8; // Process the input frame. Reuse the frames object by writing back to it Frame[] outputFrames = bcsNode.Process(inputFrames, 0); // Copy RGB content of the processed frame to the output image for (int y = 0; y < size.Height; y++) { for (int x = 0; x < size.Width; ++x) { // Reuse the created image object image.SetPixel(x, y, System.Drawing.Color.FromArgb(outputFrames[0][x, y].R, outputFrames[0][x, y].G, outputFrames[0][x, y].B)); } } image.Save("..\\..\\..\\..\\output\\papagei-bcs-" + (int)(bcsNode.Contrast * 10) + ".png"); // Set contrast to a negative value and brightness to the maximum bcsNode.Contrast = -0.6; bcsNode.Brightness = 1; outputFrames = bcsNode.Process(inputFrames, 0); for (int y = 0; y < size.Height; y++) { for (int x = 0; x < size.Width; ++x) { // Reuse the created image object image.SetPixel(x, y, System.Drawing.Color.FromArgb(outputFrames[0][x, y].R, outputFrames[0][x, y].G, outputFrames[0][x, y].B)); } } bcsNode.Brightness = -1; bcsNode.Process(inputFrames, 0); image.Save("..\\..\\..\\..\\output\\papagei-bcs-" + (int)(bcsNode.Contrast * 10) + ".png"); }
public void GlobalTest10() { MainViewModel mvm = MainViewModelTest.GetInstance(); PipelineViewModel pvm = mvm.PipelineViewModel; // Step 1: The user clicks "New" to create a new pipeline mvm.Clear(); Assert.Empty(mvm.Model.Graph.Nodes); var mock = new Mock <IDragEventInfo>(); // Step 2: Create each type of node once by drag-and-drop VideoInputNode vin = (VideoInputNode)AddNode <VideoInputNode>(pvm, mock, new Point(10, 30)); AdditiveMergeNode amn = (AdditiveMergeNode)AddNode <AdditiveMergeNode>(pvm, mock, new Point(30, 30)); BlurNode bn = (BlurNode)AddNode <BlurNode>(pvm, mock, new Point(50, 30)); BrightnessContrastSaturationNode bcsn = (BrightnessContrastSaturationNode)AddNode <BrightnessContrastSaturationNode>(pvm, mock, new Point(70, 30)); ColorInputNode cin = (ColorInputNode)AddNode <ColorInputNode>(pvm, mock, new Point(10, 50)); DelayNode dln = (DelayNode)AddNode <DelayNode>(pvm, mock, new Point(90, 30)); DiagramNode dgn = (DiagramNode)AddNode <DiagramNode>(pvm, mock, new Point(110, 30)); DifferenceNode dfn = (DifferenceNode)AddNode <DifferenceNode>(pvm, mock, new Point(30, 50)); HistogramNode hn = (HistogramNode)AddNode <HistogramNode>(pvm, mock, new Point(50, 50)); ImageInputNode imin = (ImageInputNode)AddNode <ImageInputNode>(pvm, mock, new Point(70, 50)); InverterNode invn = (InverterNode)AddNode <InverterNode>(pvm, mock, new Point(90, 50)); NoiseInputNode nin = (NoiseInputNode)AddNode <NoiseInputNode>(pvm, mock, new Point(110, 50)); OverlayNode on = (OverlayNode)AddNode <OverlayNode>(pvm, mock, new Point(10, 70)); RgbSplitNode rgbsn = (RgbSplitNode)AddNode <RgbSplitNode>(pvm, mock, new Point(30, 70)); WeightedAveragedMergeNode wamn = (WeightedAveragedMergeNode)AddNode <WeightedAveragedMergeNode>(pvm, mock, new Point(50, 70)); // Step 3: Create the edges mvm.Model.Graph.AddEdge(vin.Outputs[0], bn.Inputs[0]); Assert.Equal(vin.Outputs[0], bn.Inputs[0].Source); amn.Inputs.Add(new Node.Input()); mvm.Model.Graph.AddEdge(vin.Outputs[0], amn.Inputs[0]); Assert.Equal(vin.Outputs[0], amn.Inputs[0].Source); mvm.Model.Graph.AddEdge(bn.Outputs[0], dln.Inputs[0]); Assert.Equal(bn.Outputs[0], dln.Inputs[0].Source); mvm.Model.Graph.AddEdge(dln.Outputs[0], dfn.Inputs[0]); Assert.Equal(dln.Outputs[0], dfn.Inputs[0].Source); mvm.Model.Graph.AddEdge(imin.Outputs[0], dfn.Inputs[1]); Assert.Equal(imin.Outputs[0], dfn.Inputs[1].Source); mvm.Model.Graph.AddEdge(dfn.Outputs[0], invn.Inputs[0]); Assert.Equal(dfn.Outputs[0], invn.Inputs[0].Source); mvm.Model.Graph.AddEdge(invn.Outputs[0], on.Inputs[0]); Assert.Equal(invn.Outputs[0], on.Inputs[0].Source); mvm.Model.Graph.AddEdge(vin.Outputs[0], on.Inputs[1]); Assert.Equal(vin.Outputs[0], on.Inputs[1].Source); mvm.Model.Graph.AddEdge(vin.Outputs[0], rgbsn.Inputs[0]); Assert.Equal(vin.Outputs[0], rgbsn.Inputs[0].Source); mvm.Model.Graph.AddEdge(rgbsn.Outputs[2], hn.Inputs[0]); Assert.Equal(rgbsn.Outputs[2], hn.Inputs[0].Source); }
public void NullableDoublePropertyViewModelTest() { // Since this property viewmodel commits its change as soon as the change is made, the commitChange method // is executed, which requires a working IoC IoC.GetInstance = IoCAggregator; NullableDoublePropertyViewModel en = new NullableDoublePropertyViewModel(); BrightnessContrastSaturationNode bcs = new BrightnessContrastSaturationNode(); PropertyDescriptor pd = TypeDescriptor.GetProperties(bcs).Find("contrast", true); en.Initialize(bcs, pd); Assert.True(en.SlidersAreEnabled); Assert.Equal(pd.Attributes.OfType<RangeAttribute>().First().Maximum, en.Maximum); Assert.Equal(pd.Attributes.OfType<RangeAttribute>().First().Minimum, en.Minimum); }
public void NullableDoublePropertyViewModelTest() { // Since this property viewmodel commits its change as soon as the change is made, the commitChange method // is executed, which requires a working IoC IoC.GetInstance = IoCAggregator; NullableDoublePropertyViewModel en = new NullableDoublePropertyViewModel(); BrightnessContrastSaturationNode bcs = new BrightnessContrastSaturationNode(); PropertyDescriptor pd = TypeDescriptor.GetProperties(bcs).Find("contrast", true); en.Initialize(bcs, pd); Assert.True(en.SlidersAreEnabled); Assert.Equal(pd.Attributes.OfType <RangeAttribute>().First().Maximum, en.Maximum); Assert.Equal(pd.Attributes.OfType <RangeAttribute>().First().Minimum, en.Minimum); }
public void ViewlessPipeline() { var input = new VideoInputNode { FileName = new FilePath(@"..\..\..\..\resources\americanFootball_352x240_125.yuv") }; Node graph = new BrightnessContrastSaturationNode { Contrast = 10 }; //new BlurNode { Radius = 3 }; graph.Inputs[0].Source = input.Outputs[0]; IObservable <Frame> frames = new PipelineDriver().RenderTicks(new[] { graph }, tickCount: input.TickCount) .Select(dic => dic[graph.Outputs[0]]); YuvEncoder.Encode( @"..\..\..\..\output\ViewlessPipeline_sif.yuv", frames.ToEnumerable() ); }