From 419ebd12d539d70f88939d46597ca514d9d322e9 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Mon, 16 Aug 2021 18:11:18 -0700 Subject: [PATCH] Making a separate display image to show binary alpha and outline --- .../DesignTools/Operations/Image/Histogram.cs | 51 ++++++++++++++----- .../Operations/Image/ImageToPathObject3D_2.cs | 14 +++-- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/MatterControlLib/DesignTools/Operations/Image/Histogram.cs b/MatterControlLib/DesignTools/Operations/Image/Histogram.cs index 82605f3c4..22d6c57f7 100644 --- a/MatterControlLib/DesignTools/Operations/Image/Histogram.cs +++ b/MatterControlLib/DesignTools/Operations/Image/Histogram.cs @@ -55,19 +55,19 @@ namespace MatterHackers.MatterControl.DesignTools public event EventHandler EditComplete; - public void RebuildAlphaImage(ImageBuffer sourceImage, ImageBuffer alphaImage, ImageToPathObject3D_2.AnalysisTypes analysisType) + public void RebuildAlphaImage(ImageBuffer sourceImage, ImageBuffer alphaImage, ImageBuffer displayImage, ImageToPathObject3D_2.AnalysisTypes analysisType) { if (analysisType == ImageToPathObject3D_2.AnalysisTypes.Colors) { - RebuildColorToAlphaImage(sourceImage, alphaImage); + RebuildColorToAlphaImage(sourceImage, alphaImage, displayImage); } else { - RebuildIntensityToAlphaImage(sourceImage, alphaImage); + RebuildIntensityToAlphaImage(sourceImage, alphaImage, displayImage); } } - private void RebuildIntensityToAlphaImage(ImageBuffer sourceImage, ImageBuffer alphaImage) + private void RebuildIntensityToAlphaImage(ImageBuffer sourceImage, ImageBuffer alphaImage, ImageBuffer displayImage) { if (sourceImage == null) { @@ -75,14 +75,11 @@ namespace MatterHackers.MatterControl.DesignTools } // build the alpha image - if (alphaImage == null) - { - alphaImage = new ImageBuffer(sourceImage.Width, sourceImage.Height); - } - else if (alphaImage.Width != sourceImage.Width + if (alphaImage.Width != sourceImage.Width || alphaImage.Height != sourceImage.Height) { alphaImage.Allocate(sourceImage.Width, sourceImage.Height, sourceImage.BitDepth, sourceImage.GetRecieveBlender()); + displayImage.Allocate(sourceImage.Width, sourceImage.Height, sourceImage.BitDepth, sourceImage.GetRecieveBlender()); } var startInt = (int)(RangeStart * 255); @@ -103,9 +100,13 @@ namespace MatterHackers.MatterControl.DesignTools } else { - var s1 = 255 - Math.Min(255, ((alpha - startInt) * 255 / rangeInt)); + if (rangeInt > 64) + { + var s1 = 255 - Math.Min(255, ((alpha - startInt) * 255 / rangeInt)); + return (byte)s1; + } - return (byte)s1; + return 255; } } @@ -129,6 +130,30 @@ namespace MatterHackers.MatterControl.DesignTools }); alphaImage.MarkImageChanged(); + + byte[] displayBuffer = displayImage.GetBuffer(); + Parallel.For(0, sourceImage.Height, (y) => + { + int imageOffset = displayImage.GetBufferOffsetY(y); + + for (int x = 0; x < displayImage.Width; x++) + { + int imageBufferOffsetWithX = imageOffset + x * 4; + displayBuffer[imageBufferOffsetWithX + 0] = destBuffer[imageBufferOffsetWithX + 0]; + displayBuffer[imageBufferOffsetWithX + 1] = destBuffer[imageBufferOffsetWithX + 1]; + displayBuffer[imageBufferOffsetWithX + 2] = destBuffer[imageBufferOffsetWithX + 2]; + if (destBuffer[imageBufferOffsetWithX + 3] > 1) + { + displayBuffer[imageBufferOffsetWithX + 3] = 255; + } + else + { + displayBuffer[imageBufferOffsetWithX + 3] = 0; + } + } + }); + + displayImage.MarkImageChanged(); } private static (float hue, float saturation) GetHue(byte bR, byte bG, byte bB) @@ -211,7 +236,7 @@ namespace MatterHackers.MatterControl.DesignTools return 0; } - private void RebuildColorToAlphaImage(ImageBuffer sourceImage, ImageBuffer alphaImage) + private void RebuildColorToAlphaImage(ImageBuffer sourceImage, ImageBuffer alphaImage, ImageBuffer displayImage) { if (sourceImage == null) { @@ -251,6 +276,8 @@ namespace MatterHackers.MatterControl.DesignTools //}); alphaImage.MarkImageChanged(); + + displayImage.CopyFrom(alphaImage); } class QuickHue : IThresholdFunction diff --git a/MatterControlLib/DesignTools/Operations/Image/ImageToPathObject3D_2.cs b/MatterControlLib/DesignTools/Operations/Image/ImageToPathObject3D_2.cs index ebf52fb31..addf153c6 100644 --- a/MatterControlLib/DesignTools/Operations/Image/ImageToPathObject3D_2.cs +++ b/MatterControlLib/DesignTools/Operations/Image/ImageToPathObject3D_2.cs @@ -66,6 +66,8 @@ namespace MatterHackers.MatterControl.DesignTools Intensity, } + private ImageBuffer alphaImage; + private ImageBuffer _image; /// /// This is the image after it has been processed into an alpha image @@ -80,10 +82,11 @@ namespace MatterHackers.MatterControl.DesignTools && SourceImage != null) { _image = new ImageBuffer(SourceImage); + alphaImage = new ImageBuffer(SourceImage); Histogram.BuildHistogramFromImage(SourceImage, AnalysisType); Histogram.RangeChanged += (s, e) => { - Histogram.RebuildAlphaImage(SourceImage, _image, AnalysisType); + Histogram.RebuildAlphaImage(SourceImage, alphaImage, _image, AnalysisType); }; Histogram.EditComplete += (s, e) => @@ -94,7 +97,7 @@ namespace MatterHackers.MatterControl.DesignTools switch (AnalysisType) { case AnalysisTypes.Intensity: - Histogram.RebuildAlphaImage(SourceImage, _image, AnalysisType); + Histogram.RebuildAlphaImage(SourceImage, alphaImage, _image, AnalysisType); break; case AnalysisTypes.Transparency: @@ -134,7 +137,7 @@ namespace MatterHackers.MatterControl.DesignTools case AnalysisTypes.Intensity: case AnalysisTypes.Colors: Histogram.BuildHistogramFromImage(sourceImage, AnalysisType); - Histogram.RebuildAlphaImage(sourceImage, Image, AnalysisType); + Histogram.RebuildAlphaImage(sourceImage, alphaImage, Image, AnalysisType); break; case AnalysisTypes.Transparency: @@ -245,7 +248,8 @@ namespace MatterHackers.MatterControl.DesignTools if (AnalysisType != AnalysisTypes.Transparency) { Histogram.BuildHistogramFromImage(SourceImage, AnalysisType); - Histogram.RebuildAlphaImage(SourceImage, _image, AnalysisType); + var _ = Image; // call this to make sure it is built + Histogram.RebuildAlphaImage(SourceImage, alphaImage, Image, AnalysisType); } await Rebuild(); } @@ -296,7 +300,7 @@ namespace MatterHackers.MatterControl.DesignTools progressStatus.Status = status; reporter.Report(progressStatus); }, - Image, + alphaImage, new AlphaFunction()); break; }