void LoadImageStream(Stream stream) { bitmap.SetStream(stream); if (bitmap.Width * bitmap.Height > imageSize) { var scale = Math.Sqrt(imageSize * 1.0 / (bitmap.Width * bitmap.Height)); var resizedBitmap = new C1Bitmap((int)(bitmap.Width * scale), (int)(bitmap.Height * scale)); resizedBitmap.Copy(bitmap, true); bitmap = resizedBitmap; } originalBitmap.Copy(bitmap, false); screen.Copy(bitmap, false); imageGrid.Width = screen.Width; imageGrid.Height = screen.Height; }
void Warp(C1Bitmap src, C1Bitmap dst, Point start, Point end) { dst.BeginUpdate(); dst.Copy(src, false); var dist = Distance(start, end); var affectedDist = dist * 1.5; var affectedDistSquared = affectedDist * affectedDist; for (int row = 0; row < dst.Height; ++row) { for (int col = 0; col < dst.Width; ++col) { var point = new Point(col, row); if (DistanceSq(start, point) > affectedDistSquared) { continue; } if (DistanceSq(end, point) < 0.25) { dst.SetPixel(col, row, src.GetPixel((int)start.X, (int)start.Y)); continue; } var dir = new Point(point.X - end.X, point.Y - end.Y); var t = IntersectRayCircle(end, dir, start, affectedDist); TryT(-end.X / dir.X, ref t); TryT(-end.Y / dir.Y, ref t); TryT((dst.Width - end.X) / dir.X, ref t); TryT((dst.Height - end.X) / dir.X, ref t); var anchor = new Point(end.X + (point.X - end.X) * t, end.Y + (point.Y - end.Y)); var x = start.X + (anchor.X - start.X) / t; var y = start.Y + (anchor.Y - start.Y) / t; dst.SetPixel(col, row, src.GetInterpolatedPixel(x, y)); } } dst.EndUpdate(); }
private void Restart(object sender, RoutedEventArgs e) { bitmap.Copy(originalBitmap, false); screen.Copy(originalBitmap, false); }