From 3ea6f2cb088e349caf379313c0cee3a16047cadd Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Tue, 3 May 2016 23:44:16 -0700 Subject: [PATCH] Added IImageProcessor, PolygonalImageProcessor --- OSCADSharp/OSCADSharp.ConsoleTests/Program.cs | 12 +-- OSCADSharp/OSCADSharp/OSCADSharp.csproj | 3 + .../Solids/Imported/CubistImageProcessor.cs | 14 ++-- .../Solids/Imported/IImageProcessor.cs | 15 ++++ .../Solids/Imported/ImageImportMode.cs | 26 +++++++ .../Solids/Imported/ImportedImage.cs | 17 ++++- .../Imported/PolygonalImageProcessor.cs | 76 +++++++++++++++++++ 7 files changed, 150 insertions(+), 13 deletions(-) create mode 100644 OSCADSharp/OSCADSharp/Solids/Imported/IImageProcessor.cs create mode 100644 OSCADSharp/OSCADSharp/Solids/Imported/ImageImportMode.cs create mode 100644 OSCADSharp/OSCADSharp/Solids/Imported/PolygonalImageProcessor.cs diff --git a/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs b/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs index a9dd0b8..0659bc7 100644 --- a/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs +++ b/OSCADSharp/OSCADSharp.ConsoleTests/Program.cs @@ -58,14 +58,16 @@ namespace OSCADSharp.ConsoleTests static void Main(string[] args) { var img = ImportedImage.FromFile("seahawks coaster.png").Scale(1, 1, Inches.Quarter + Inches.Eigth); - var imgPos = img.Position(); - var _base = new Cylinder(img.Bounds().Width + Inches.Quarter, Inches.Quarter); + img.ToFile("testImg").Open(); - var rim = _base.Clone().Scale(1, 1, 1.25) - _base.Clone().Scale(.9, .9, 3.5).Translate(0, 0, -Inches.Eigth); - var coaster = img + _base.Translate(imgPos.X, imgPos.Y, 0) + rim.Translate(imgPos.X, imgPos.Y, Inches.Quarter); ; + //var imgPos = img.Position(); + //var _base = new Cylinder(img.Bounds().Width + Inches.Quarter, Inches.Quarter); + + //var rim = _base.Clone().Scale(1, 1, 1.25) - _base.Clone().Scale(.9, .9, 3.5).Translate(0, 0, -Inches.Eigth); + //var coaster = img + _base.Translate(imgPos.X, imgPos.Y, 0) + rim.Translate(imgPos.X, imgPos.Y, Inches.Quarter); ; - coaster.ToFile("seaImg").Open(); + //coaster.ToFile("seaImg").Open(); //makePeg(); diff --git a/OSCADSharp/OSCADSharp/OSCADSharp.csproj b/OSCADSharp/OSCADSharp/OSCADSharp.csproj index 8e45585..41a2b7c 100644 --- a/OSCADSharp/OSCADSharp/OSCADSharp.csproj +++ b/OSCADSharp/OSCADSharp/OSCADSharp.csproj @@ -49,8 +49,11 @@ + + + diff --git a/OSCADSharp/OSCADSharp/Solids/Imported/CubistImageProcessor.cs b/OSCADSharp/OSCADSharp/Solids/Imported/CubistImageProcessor.cs index d772bf0..3285c21 100644 --- a/OSCADSharp/OSCADSharp/Solids/Imported/CubistImageProcessor.cs +++ b/OSCADSharp/OSCADSharp/Solids/Imported/CubistImageProcessor.cs @@ -11,7 +11,7 @@ namespace OSCADSharp.Solids.Imported /// /// Processes a bitmap image by treating contiguous same-color regions as cubes /// - internal class CubistImageProcessor + internal class CubistImageProcessor : IImageProcessor { #region Private Fields private string imagePath; @@ -19,15 +19,15 @@ namespace OSCADSharp.Solids.Imported #endregion #region Internal Fields - internal Bounds ImageBounds { get; set; } + public Bounds ImageBounds { get; set; } #endregion - public CubistImageProcessor(string imagePath) + internal CubistImageProcessor(string imagePath) { this.imagePath = imagePath; } - internal OSCADObject ProcessImage() + public OSCADObject ProcessImage() { this.cubes = this.processImage(); OSCADObject obj = new OSCADObject.MultiStatementObject("union()", cubes); @@ -36,8 +36,9 @@ namespace OSCADSharp.Solids.Imported return obj; } - + + #region Private Methods private List processImage() { Bitmap img = new Bitmap(Image.FromFile(this.imagePath)); @@ -174,5 +175,8 @@ namespace OSCADSharp.Solids.Imported return null; } + + + #endregion } } diff --git a/OSCADSharp/OSCADSharp/Solids/Imported/IImageProcessor.cs b/OSCADSharp/OSCADSharp/Solids/Imported/IImageProcessor.cs new file mode 100644 index 0000000..b725d6d --- /dev/null +++ b/OSCADSharp/OSCADSharp/Solids/Imported/IImageProcessor.cs @@ -0,0 +1,15 @@ +using OSCADSharp.Spatial; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OSCADSharp.Solids.Imported +{ + internal interface IImageProcessor + { + OSCADObject ProcessImage(); + Bounds ImageBounds { get; set; } + } +} diff --git a/OSCADSharp/OSCADSharp/Solids/Imported/ImageImportMode.cs b/OSCADSharp/OSCADSharp/Solids/Imported/ImageImportMode.cs new file mode 100644 index 0000000..ac332cd --- /dev/null +++ b/OSCADSharp/OSCADSharp/Solids/Imported/ImageImportMode.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OSCADSharp.Solids.Imported +{ + /// + /// Ways to process imported images into 3D models + /// + public enum ImageImportMode + { + /// + /// Cubist import mode subdivides the image into rectangular sections, + /// forming the bitmap from groupings of cubes representing its pixels + /// + Cubist, + + /// + /// Polygonal import model scans the image for sections that can be represented + /// by whole polygons for each contiguous area + /// + Polygonal + } +} diff --git a/OSCADSharp/OSCADSharp/Solids/Imported/ImportedImage.cs b/OSCADSharp/OSCADSharp/Solids/Imported/ImportedImage.cs index 828411d..f1aab61 100644 --- a/OSCADSharp/OSCADSharp/Solids/Imported/ImportedImage.cs +++ b/OSCADSharp/OSCADSharp/Solids/Imported/ImportedImage.cs @@ -24,19 +24,30 @@ namespace OSCADSharp.Solids.Imported /// Creates an imported image from the specified file /// /// + /// /// - public static ImportedImage FromFile(string imagePath) + public static ImportedImage FromFile(string imagePath, ImageImportMode mode = ImageImportMode.Cubist) { + IImageProcessor processor; + if(mode == ImageImportMode.Cubist) + { + processor = new CubistImageProcessor(imagePath); + } + else + { + processor = new PolygonalImageProcessor(imagePath); + } - var processor = new CubistImageProcessor(imagePath); var obj = processor.ProcessImage(); - var img = new ImportedImage() { + var img = new ImportedImage() + { m_Object = obj, m_Bounds = processor.ImageBounds }; return img; + } #endregion diff --git a/OSCADSharp/OSCADSharp/Solids/Imported/PolygonalImageProcessor.cs b/OSCADSharp/OSCADSharp/Solids/Imported/PolygonalImageProcessor.cs new file mode 100644 index 0000000..c774178 --- /dev/null +++ b/OSCADSharp/OSCADSharp/Solids/Imported/PolygonalImageProcessor.cs @@ -0,0 +1,76 @@ +using OSCADSharp.Spatial; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OSCADSharp.Solids.Imported +{ + /// + /// Processes a bitmap image by treating contiguous same-color regions as cubes + /// + internal class PolygonalImageProcessor : IImageProcessor + { + #region Private Fields + private string imagePath; + #endregion + + #region Public Fields + public Bounds ImageBounds { get; set; } + #endregion + + #region Constructors + internal PolygonalImageProcessor(string imagePath) + { + this.imagePath = imagePath; + } + #endregion + + public OSCADObject ProcessImage() + { + var polygons = this.processImage(); + OSCADObject obj = new OSCADObject.MultiStatementObject("union()", polygons); + obj = obj.Rotate(0, 0, 180); + obj = obj.Translate(ImageBounds.Length, ImageBounds.Width, 0); + + return obj; + } + + private List processImage() + { + Bitmap img = new Bitmap(Image.FromFile(this.imagePath)); + + if (img.Width > 200 || img.Height > 200) + { + throw new InvalidOperationException("Cannot process images larger greater than 200x200 pixels"); + } + + this.ImageBounds = new Bounds(new Vector3(), new Vector3(img.Width, img.Height, 1)); + + var separatedColors = this.separateColors(img); + throw new NotImplementedException(); + } + + private Dictionary>> separateColors(Bitmap img) + { + var colorGroupings = new Dictionary>>(); + for (int column = 0; column < img.Width; column++) + { + for (int row = 0; row < img.Height; row++) + { + var color = img.GetPixel(column, row); + if (!colorGroupings.ContainsKey(color.Name)) + { + colorGroupings[color.Name] = new List>(); + } + + colorGroupings[color.Name].Add(new KeyValuePair(new Point(column, row), color)); + } + } + + return colorGroupings; + } + } +}