Making a separate display image to show binary alpha and outline

This commit is contained in:
Lars Brubaker 2021-08-16 18:11:18 -07:00
parent 93735995b7
commit 419ebd12d5
2 changed files with 48 additions and 17 deletions

View file

@ -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

View file

@ -66,6 +66,8 @@ namespace MatterHackers.MatterControl.DesignTools
Intensity,
}
private ImageBuffer alphaImage;
private ImageBuffer _image;
/// <summary>
/// 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;
}