diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-03-03 00:29:03 +0200 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-03-03 00:29:03 +0200 |
| commit | e02d0d2188f123618b7e394405769918a485309c (patch) | |
| tree | 21dea04e83bc20cb80eaac8f5011513301d406c1 /Software/Experiments | |
| parent | 0dcd742a3c35527386a93e1b1ef761c2aeff8308 (diff) | |
| download | Tango-e02d0d2188f123618b7e394405769918a485309c.tar.gz Tango-e02d0d2188f123618b7e394405769918a485309c.zip | |
Improved GifEncoder.
Reactivated Png8BitEncoder.
Refactored BitmapComparer to return the number of diffs.
TestApp now use the best possible outcome.
Diffstat (limited to 'Software/Experiments')
8 files changed, 39 insertions, 33 deletions
diff --git a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/BitmapComparerResult.cs b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/BitmapComparerResult.cs index 66a2f8660..1ebd4a529 100644 --- a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/BitmapComparerResult.cs +++ b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/BitmapComparerResult.cs @@ -18,8 +18,8 @@ namespace Tango.RemoteDesktop public TFrame Frame { get; set; } /// <summary> - /// Gets or sets a value indicating whether the <see cref="Frame"/> contains any differences. + /// Gets or sets the number of differences. /// </summary> - public bool ContainsDifference { get; set; } + public uint DifferenceCount { get; set; } } } diff --git a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Comparers/RasterBitmapComparer.cs b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Comparers/RasterBitmapComparer.cs index 34250cc59..b1b186065 100644 --- a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Comparers/RasterBitmapComparer.cs +++ b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Comparers/RasterBitmapComparer.cs @@ -34,7 +34,7 @@ namespace Tango.RemoteDesktop.Comparers if (previousBitmap.Height != currentBitmap.Height || previousBitmap.Width != currentBitmap.Width) throw new InvalidOperationException("Cannot compare image of different size."); - bool hasDifference = false; + uint count = 0; Color matchColor = Color.Transparent; @@ -93,7 +93,7 @@ namespace Tango.RemoteDesktop.Comparers if (same != 4) { - hasDifference = true; + count++; } } @@ -113,7 +113,7 @@ namespace Tango.RemoteDesktop.Comparers return new BitmapComparerResult<RasterFrame>() { Frame = new RasterFrame(diffImage), - ContainsDifference = hasDifference + DifferenceCount = count }; } } diff --git a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Comparers/VectorBitmapComparer.cs b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Comparers/VectorBitmapComparer.cs index 2500e8ac7..7f6dd9ccf 100644 --- a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Comparers/VectorBitmapComparer.cs +++ b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Comparers/VectorBitmapComparer.cs @@ -31,7 +31,7 @@ namespace Tango.RemoteDesktop.Comparers { VectorFrame vector = new VectorFrame(previousBitmap.Width, previousBitmap.Height); - bool hasDifference = false; + uint count = 0; if (previousBitmap == null | currentBitmap == null) throw new InvalidOperationException("Cannot compare image. They are the same instance"); @@ -104,7 +104,7 @@ namespace Tango.RemoteDesktop.Comparers Color = color }); - hasDifference = true; + count++; } } @@ -122,7 +122,7 @@ namespace Tango.RemoteDesktop.Comparers return new BitmapComparerResult<VectorFrame>() { Frame = vector, - ContainsDifference = hasDifference + DifferenceCount = count }; } } diff --git a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Encoders/GifEncoder.cs b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Encoders/GifEncoder.cs index abf69d9a8..a97107dad 100644 --- a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Encoders/GifEncoder.cs +++ b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Encoders/GifEncoder.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using Tango.RemoteDesktop.Quantization; namespace Tango.RemoteDesktop.Encoders { @@ -24,10 +25,11 @@ namespace Tango.RemoteDesktop.Encoders public override MemoryStream ToStream(long quality) { MemoryStream ms = new MemoryStream(); - var gif = MakeTransparentGif(Frame.ToBitmap(), Color.Transparent); - gif.Save(ms, ImageFormat.Gif); - gif.Dispose(); + var quantizer = new OctreeQuantizer(256, true); + var quantized = quantizer.Quantize(Frame.ToBitmap()); + quantized.Save(ms, ImageFormat.Gif); ms.Position = 0; + quantized.Dispose(); return ms; } diff --git a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Encoders/Png8BitEncoder.cs b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Encoders/Png8BitEncoder.cs index a3993d76d..7caa61bcf 100644 --- a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Encoders/Png8BitEncoder.cs +++ b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Encoders/Png8BitEncoder.cs @@ -19,17 +19,17 @@ namespace Tango.RemoteDesktop.Encoders public override MemoryStream ToStream() { MemoryStream ms = new MemoryStream(); - //var quantizer = new OctreeQuantizer(256, true); - //var quantized = quantizer.Quantize(Frame.ToBitmap()); + var quantizer = new OctreeQuantizer(256, true); + var quantized = quantizer.Quantize(Frame.ToBitmap()); ImageCodecInfo icf = GetEncoder(ImageFormat.Png); EncoderParameters parms = new EncoderParameters(1); EncoderParameter parm = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 8); parms.Param[0] = parm; - Frame.ToBitmap().Save(ms, icf, parms); + quantized.Save(ms, icf, parms); ms.Position = 0; - //quantized.Dispose(); + quantized.Dispose(); return ms; } diff --git a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/ScreenCaptureEngine.cs b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/ScreenCaptureEngine.cs index 915147d2a..1d7b4d7d4 100644 --- a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/ScreenCaptureEngine.cs +++ b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/ScreenCaptureEngine.cs @@ -151,19 +151,19 @@ namespace Tango.RemoteDesktop if (_previousBitmap == null) { _previousBitmap = bitmap.Clone() as Bitmap; - OnFrameReceived(bitmap, null, false); + OnFrameReceived(bitmap, null, 0); } else { var result = Comparer.CreateDifference(_previousBitmap, bitmap); _previousBitmap.Dispose(); _previousBitmap = bitmap.Clone() as Bitmap; - OnFrameReceived(bitmap, result.Frame, result.ContainsDifference); + OnFrameReceived(bitmap, result.Frame, result.DifferenceCount); } } else { - OnFrameReceived(bitmap, null, false); + OnFrameReceived(bitmap, null, 0); } int delay = Math.Max(5, (FrameRate * 10) - (int)watch.ElapsedMilliseconds); @@ -171,13 +171,13 @@ namespace Tango.RemoteDesktop } } - private void OnFrameReceived(Bitmap currentBitmap, TFrame diffFrame, bool hasDifference) + private void OnFrameReceived(Bitmap currentBitmap, TFrame diffFrame, uint differenceCount) { FrameReceived?.Invoke(this, new ScreenCaptureFrameReceivedEventArgs<TFrame>() { Frame = new ScreenCaptureFrame<TFrame>(currentBitmap, diffFrame) { - HasDifference = hasDifference + DifferenceCount = differenceCount } }); } diff --git a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/ScreenCaptureFrame.cs b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/ScreenCaptureFrame.cs index 75e7a961f..12d749954 100644 --- a/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/ScreenCaptureFrame.cs +++ b/Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/ScreenCaptureFrame.cs @@ -48,17 +48,9 @@ namespace Tango.RemoteDesktop } /// <summary> - /// Gets or sets a value indicating whether the difference frame is available and contains any differences. + /// Gets or sets the number differences. /// </summary> - private bool _hasDifference; - public bool HasDifference - { - get - { - return DifferenceAvailable && _hasDifference; - } - set { _hasDifference = value; } - } + public uint DifferenceCount { get; set; } /// <summary> /// Returns the difference frame. diff --git a/Software/Experiments/Tango.RemoteDesktop/WpfApp1/MainWindow.xaml.cs b/Software/Experiments/Tango.RemoteDesktop/WpfApp1/MainWindow.xaml.cs index fd0df286c..6bd0b7a23 100644 --- a/Software/Experiments/Tango.RemoteDesktop/WpfApp1/MainWindow.xaml.cs +++ b/Software/Experiments/Tango.RemoteDesktop/WpfApp1/MainWindow.xaml.cs @@ -51,15 +51,27 @@ namespace WpfApp1 { BitmapSource preview = null; + Stopwatch watch = new Stopwatch(); + int size = 0; + long encodingTime = 0; if (e.Frame.DifferenceAvailable) { - if (e.Frame.HasDifference) + if (e.Frame.DifferenceCount > 0) { + watch.Restart(); + var diffFrame = e.Frame.ToDifference(); - var bitmapStream = diffFrame.OptimizeBounds().ToEncoder<PngEncoder>().ToStream(); + MemoryStream bitmapStream = null; + + //This is the best possible outcome !!! + diffFrame = diffFrame.OptimizeBounds(); + bitmapStream = diffFrame.ToEncoder<PngEncoder>().ToStream(); + + + encodingTime = watch.ElapsedMilliseconds; size = (int)bitmapStream.Length; @@ -75,7 +87,7 @@ namespace WpfApp1 var updatedFrame = new RasterFrame(_currentBitmap); preview = updatedFrame.ToBitmapSource(); - Debug.WriteLine($"Actual frame size on network: {size / 1000} kb"); + Debug.WriteLine($"Actual frame size on network: {Math.Round((double)size / 1000d, 2)} kb, Encoding time: {encodingTime} milli, Differences: {e.Frame.DifferenceCount}"); Dispatcher.BeginInvoke(new Action(() => { |
