aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2020-03-03 00:29:03 +0200
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2020-03-03 00:29:03 +0200
commite02d0d2188f123618b7e394405769918a485309c (patch)
tree21dea04e83bc20cb80eaac8f5011513301d406c1
parent0dcd742a3c35527386a93e1b1ef761c2aeff8308 (diff)
downloadTango-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.
-rw-r--r--Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/BitmapComparerResult.cs4
-rw-r--r--Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Comparers/RasterBitmapComparer.cs6
-rw-r--r--Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Comparers/VectorBitmapComparer.cs6
-rw-r--r--Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Encoders/GifEncoder.cs8
-rw-r--r--Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/Encoders/Png8BitEncoder.cs8
-rw-r--r--Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/ScreenCaptureEngine.cs10
-rw-r--r--Software/Experiments/Tango.RemoteDesktop/Tango.RemoteDesktop/ScreenCaptureFrame.cs12
-rw-r--r--Software/Experiments/Tango.RemoteDesktop/WpfApp1/MainWindow.xaml.cs18
-rw-r--r--Software/Visual_Studio/Tango.RemoteDesktop/Encoders/GifEncoder.cs8
-rw-r--r--Software/Visual_Studio/Tango.RemoteDesktop/Encoders/Png8BitEncoder.cs8
10 files changed, 48 insertions, 40 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(() =>
{
diff --git a/Software/Visual_Studio/Tango.RemoteDesktop/Encoders/GifEncoder.cs b/Software/Visual_Studio/Tango.RemoteDesktop/Encoders/GifEncoder.cs
index abf69d9a8..a97107dad 100644
--- a/Software/Visual_Studio/Tango.RemoteDesktop/Encoders/GifEncoder.cs
+++ b/Software/Visual_Studio/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/Visual_Studio/Tango.RemoteDesktop/Encoders/Png8BitEncoder.cs b/Software/Visual_Studio/Tango.RemoteDesktop/Encoders/Png8BitEncoder.cs
index a3993d76d..7caa61bcf 100644
--- a/Software/Visual_Studio/Tango.RemoteDesktop/Encoders/Png8BitEncoder.cs
+++ b/Software/Visual_Studio/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;
}