/// <summary> /// Converts an image to ASCII art /// </summary> /// <param name="Input">The image you wish to convert</param> /// <returns>A string containing the art</returns> public static string ConvertToASCII(Bitmap Input) { if (Input == null) throw new ArgumentNullException("Input"); bool ShowLine = true; using (Bitmap TempImage = Input.BlackAndWhite()) { BitmapData OldData = TempImage.LockImage(); int OldPixelSize = OldData.GetPixelSize(); StringBuilder Builder = new StringBuilder(); for (int x = 0; x < TempImage.Height; ++x) { for (int y = 0; y < TempImage.Width; ++y) { if (ShowLine) { Color CurrentPixel = OldData.GetPixel(y, x, OldPixelSize); Builder.Append(_ASCIICharacters[((CurrentPixel.R * _ASCIICharacters.Length) / 255)]); } } if (ShowLine) { Builder.Append(System.Environment.NewLine); ShowLine = false; } else { ShowLine = true; } } TempImage.UnlockImage(OldData); return Builder.ToString(); } }
public void Colorize() { using (Bitmap TestObject = new Bitmap(@"..\..\Data\Image\Lenna.jpg")) { List<Color> Colors = new List<Color>(); for (int x = 0; x < 256; ++x) Colors.Add(Color.FromArgb(255 - x, 0, x)); using (Bitmap TestObject2 = TestObject.BlackAndWhite()) { using (Bitmap Image = Assert.Do<Bitmap>(() => TestObject2.Colorize(Colors.ToArray(), @".\Testing\LennaColorize.jpg"))) { Assert.NotNull(Image); } } } }
/// <summary> /// Runs the motion detection algorithm /// </summary> /// <param name="NewImage">The "new" frame</param> /// <param name="OldImage">The "old" frame</param> /// <param name="Threshold">The threshold used to detect changes in the image</param> /// <param name="DetectionColor">Color to display changes in the images as</param> /// <returns>A bitmap indicating where changes between frames have occurred overlayed on top of the new image.</returns> public static Bitmap Process(Bitmap NewImage, Bitmap OldImage, int Threshold, Color DetectionColor) { if (NewImage == null) throw new ArgumentNullException("NewImage"); if (OldImage == null) throw new ArgumentNullException("OldImage"); if (DetectionColor == null) throw new ArgumentNullException("DetectionColor"); using (Bitmap NewImage1 = NewImage.BlackAndWhite()) { using (Bitmap OldImage1 = OldImage.BlackAndWhite()) { using (Bitmap NewImage2 = NewImage1.SNNBlur(5)) { using (Bitmap OldImage2 = OldImage1.SNNBlur(5)) { using (Bitmap OutputImage = new Bitmap(NewImage2, NewImage2.Width, NewImage2.Height)) { using (Bitmap Overlay = new Bitmap(NewImage, NewImage.Width, NewImage.Height)) { BitmapData NewImage2Data = NewImage2.LockImage(); int NewImage2PixelSize = NewImage2Data.GetPixelSize(); BitmapData OldImage2Data = OldImage2.LockImage(); int OldImage2PixelSize = OldImage2Data.GetPixelSize(); BitmapData OverlayData = Overlay.LockImage(); int OverlayPixelSize = OverlayData.GetPixelSize(); for (int x = 0; x < OutputImage.Width; ++x) { for (int y = 0; y < OutputImage.Height; ++y) { Color NewPixel = NewImage2Data.GetPixel(x, y, NewImage2PixelSize); Color OldPixel = OldImage2Data.GetPixel(x, y, OldImage2PixelSize); if (System.Math.Pow((double)(NewPixel.R - OldPixel.R), 2.0) > Threshold) { OverlayData.SetPixel(x, y, Color.FromArgb(100, 0, 100), OverlayPixelSize); } else { OverlayData.SetPixel(x, y, Color.FromArgb(200, 0, 200), OverlayPixelSize); } } } Overlay.UnlockImage(OverlayData); NewImage2.UnlockImage(NewImage2Data); OldImage2.UnlockImage(OldImage2Data); using (Bitmap Overlay2 = Overlay.EdgeDetection(25, DetectionColor)) { BitmapData Overlay2Data = Overlay2.LockImage(); int Overlay2PixelSize = Overlay2Data.GetPixelSize(); for (int x = 0; x < OutputImage.Width; ++x) { for (int y = 0; y < OutputImage.Height; ++y) { Color Pixel1 = Overlay2Data.GetPixel(x, y, Overlay2PixelSize); if (Pixel1.R != DetectionColor.R || Pixel1.G != DetectionColor.G || Pixel1.B != DetectionColor.B) { Overlay2Data.SetPixel(x, y, Color.FromArgb(200, 0, 200), Overlay2PixelSize); } } } Overlay2.UnlockImage(Overlay2Data); return OutputImage.Watermark(Overlay2, 1.0f, 0, 0, Color.FromArgb(200, 0, 200)); } } } } } } } }
public void BlackAndWhite() { using (Bitmap TestObject = new Bitmap(@"..\..\Data\Image\Lenna.jpg")) { using (Bitmap Image = Assert.Do<Bitmap>(() => TestObject.BlackAndWhite(@".\Testing\LennaBlackAndWhite.jpg"))) { Assert.NotNull(Image); } } }
/// <summary> /// Runs a simplistic motion detection algorithm /// </summary> /// <param name="NewImage">The "new" frame</param> /// <param name="OldImage">The "old" frame</param> /// <param name="Threshold">The threshold used to detect changes in the image</param> /// <param name="DetectionColor">Color to display changes in the images as</param> /// <returns>A bitmap indicating where changes between frames have occurred overlayed on top of the new image.</returns> public static Bitmap MotionDetection(this Bitmap NewImage, Bitmap OldImage, int Threshold, Color DetectionColor) { NewImage.ThrowIfNull("NewImage"); OldImage.ThrowIfNull("OldImage"); DetectionColor.ThrowIfNull("DetectionColor"); using (Bitmap NewImage1 = NewImage.BlackAndWhite()) { using (Bitmap OldImage1 = OldImage.BlackAndWhite()) { using (Bitmap NewImage2 = NewImage1.SNNBlur(5)) { using (Bitmap OldImage2 = OldImage1.SNNBlur(5)) { using (Bitmap OutputImage = new Bitmap(NewImage2, NewImage2.Width, NewImage2.Height)) { using (Bitmap Overlay = new Bitmap(NewImage, NewImage.Width, NewImage.Height)) { BitmapData NewImage2Data = NewImage2.LockImage(); int NewImage2PixelSize = NewImage2Data.GetPixelSize(); BitmapData OldImage2Data = OldImage2.LockImage(); int OldImage2PixelSize = OldImage2Data.GetPixelSize(); BitmapData OverlayData = Overlay.LockImage(); int OverlayPixelSize = OverlayData.GetPixelSize(); int Width = OutputImage.Width; int Height = OutputImage.Height; Parallel.For(0, Width, x => { for (int y = 0; y < Height; ++y) { Color NewPixel = NewImage2Data.GetPixel(x, y, NewImage2PixelSize); Color OldPixel = OldImage2Data.GetPixel(x, y, OldImage2PixelSize); if (System.Math.Pow((double)(NewPixel.R - OldPixel.R), 2.0) > Threshold) { OverlayData.SetPixel(x, y, Color.FromArgb(100, 0, 100), OverlayPixelSize); } else { OverlayData.SetPixel(x, y, Color.FromArgb(200, 0, 200), OverlayPixelSize); } } }); Overlay.UnlockImage(OverlayData); NewImage2.UnlockImage(NewImage2Data); OldImage2.UnlockImage(OldImage2Data); using (Bitmap Overlay2 = Overlay.EdgeDetection(25, DetectionColor)) { BitmapData Overlay2Data = Overlay2.LockImage(); int Overlay2PixelSize = Overlay2Data.GetPixelSize(); Width = OutputImage.Width; Height = OutputImage.Height; Parallel.For(0, Width, x => { for (int y = 0; y < Height; ++y) { Color Pixel1 = Overlay2Data.GetPixel(x, y, Overlay2PixelSize); if (Pixel1.R != DetectionColor.R || Pixel1.G != DetectionColor.G || Pixel1.B != DetectionColor.B) { Overlay2Data.SetPixel(x, y, Color.FromArgb(200, 0, 200), Overlay2PixelSize); } } }); Overlay2.UnlockImage(Overlay2Data); return OutputImage.Watermark(Overlay2, 1.0f, 0, 0, Color.FromArgb(200, 0, 200)); } } } } } } } }