private void Form1_Paint(object sender, PaintEventArgs e) { const bool MULTITHREADED = true; Graphics gr = e.Graphics; RectangleF vcb = gr.VisibleClipBounds; if (MULTITHREADED) { const int DELTA = 100; int width = (int)vcb.Width; int height = (int)vcb.Height; List <Tuple <Thread, BitmapFragment> > threads = new List <Tuple <Thread, BitmapFragment> >(); for (int x = 0; x < width; x += DELTA) { for (int y = 0; y < height; y += DELTA) { Thread thread = new Thread(drawFragmentObj); BitmapFragment bf = new BitmapFragment( new Bitmap(DELTA, DELTA), x, y, width, height, 0.1 * waveFadeRate.Value, gr); threads.Add(new Tuple <Thread, BitmapFragment>(thread, bf)); thread.Start(bf); } } foreach (Tuple <Thread, BitmapFragment> thread in threads) { thread.Item1.Join(); } } else { drawFragment(new BitmapFragment( new Bitmap((int)vcb.Width, (int)vcb.Height), 0, 0, (int)vcb.Width, (int)vcb.Height, 0.1 * waveFadeRate.Value, gr)); } foreach (List <Tuple <float, float> > pts in allPoints) { Pen pen = pts == pointsR ? Pens.DarkRed : pts == pointsG ? Pens.DarkGreen : Pens.DarkBlue; foreach (Tuple <float, float> p in pts) { gr.DrawEllipse(pen, new Rectangle { X = (int)(p.Item1 * vcb.Width) - 5, Y = (int)(p.Item2 * vcb.Height) - 5, Width = 10, Height = 10 }); } } }
public List <IImageFragment> FragmentImage(Bitmap bitmap) { var toreturn = new List <IImageFragment>(); var fragment = new BitmapFragment(bitmap); var single_fragment = new ImageFragment(fragment, new Point { X = 0, Y = 0 }); toreturn.Add(single_fragment); return(toreturn); }
private void drawFragment(BitmapFragment bf) { for (int x = bf.dx, xl = bf.dx + bf.bm.Width; x < xl; ++x) { for (int y = bf.dy, yl = bf.dy + bf.bm.Height; y < yl; ++y) { int r = 0, g = 0, b = 0; foreach (List <Tuple <float, float> > pts in allPoints) { if (pts.Count > 0) { double wave = 0, waves = 0; foreach (Tuple <float, float> p in pts) { int px = (int)(p.Item1 * bf.width); int py = (int)(p.Item2 * bf.height); double dist = distance(x, y, px, py); wave += Math.Pow(bf.fadeRate, dist / 63) * Math.Cos(0.05 * dist); ++waves; } if (pts == pointsR) { r = (int)(127 + 127 * (wave / waves)); } else if (pts == pointsG) { g = (int)(127 + 127 * (wave / waves)); } else { b = (int)(127 + 127 * (wave / waves)); } } } bf.bm.SetPixel(x - bf.dx, y - bf.dy, Color.FromArgb(r, g, b)); } } lock (bf.gr) { bf.gr.DrawImage(bf.bm, bf.dx, bf.dy); } }
public void AverageColorBuiltBitmap() { Bitmap b = new Bitmap(2, 2); b.SetPixel(0, 0, ImageProcessor.Imaging.Colors.RgbaColor.FromRgba(0, 0, 0xff, 0xff)); b.SetPixel(0, 1, ImageProcessor.Imaging.Colors.RgbaColor.FromRgba(0, 0, 0xff, 0xff)); b.SetPixel(1, 0, ImageProcessor.Imaging.Colors.RgbaColor.FromRgba(0, 0xff, 0xff, 0xff)); b.SetPixel(1, 1, ImageProcessor.Imaging.Colors.RgbaColor.FromRgba(0, 0xff, 0xff, 0xff)); var bt = new BitmapFragment(b); var average = bt.AverageColor(); Assert.AreEqual(0, average.R); Assert.AreEqual(0x7f, average.G); Assert.AreEqual(0xff, average.B); }
public List <IImageFragment> FragmentImage(Bitmap bitmap) { var toreturn = new List <IImageFragment>(); var xtilecount = Math.Floor(bitmap.Size.Width / 16.0); var ytilecount = Math.Floor(bitmap.Size.Height / 16.0); for (var xtilenr = 0; xtilenr < xtilecount; xtilenr++) { for (var ytilenr = 0; ytilenr < ytilecount; ytilenr++) { var position = new Point(xtilenr * 16, ytilenr * 16); var size = new Size(new Point(16, 16)); var sub_bitmap = bitmap.Clone(new Rectangle(position, size), bitmap.PixelFormat); var fragment = new BitmapFragment(sub_bitmap); var single_fragment = new ImageFragment(fragment, position); toreturn.Add(single_fragment); } } return(toreturn); }