| ofs | hex dump | ascii |
|---|
| 0000 | d0 cf 11 e0 a1 b1 1a e1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3e 00 04 00 fe ff 0c 00 | ........................>....... |
| 0020 | 06 00 00 00 00 00 00 00 02 00 00 00 04 00 00 00 01 00 00 00 00 00 00 00 00 10 00 00 02 00 00 00 | ................................ |
| 0040 | 01 00 00 00 fe ff ff ff 00 00 00 00 00 00 00 00 00 04 00 00 00 08 00 00 00 0c 00 00 ff ff ff ff | ................................ |
| 0060 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 0080 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 00a0 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 00c0 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 00e0 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 0100 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 0120 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 0140 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 0160 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 0180 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 01a0 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 01c0 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 01e0 | ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff | ................................ |
| 0200 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0220 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0240 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0260 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0280 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 02a0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 02c0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 02e0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0300 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0320 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0340 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0360 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0380 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 03a0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 03c0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 03e0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0400 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0420 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0440 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0460 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0480 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 04a0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 04c0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 04e0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................................ |
| 0500 | 00 00 00 00 00 using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace Tango.SharedUI.Rendering
{
/// <summary>
/// Represents an on window chart renderer.
/// </summary>
public partial class RenderWindow : Window
{
private Action<String> _fileCallback;
private Action<RenderTargetBitmap> _bitmapCallback;
private Size _renderSize;
private ImageFormat _format;
private int _quality;
private String _filePath;
private FrameworkElement _element;
private bool renderToFile;
/// <summary>
/// Initializes a new instance of the <see cref="RenderWindow"/> class.
/// </summary>
/// <param name="element">The element.</param>
public RenderWindow(FrameworkElement element)
{
InitializeComponent();
element.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
element.VerticalAlignment = System.Windows.VerticalAlignment.Top;
_element = element;
grid.Children.Add(_element);
}
/// <summary>
/// Occurs when the window is completely loaded.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
private void RenderWindow_ContentRendered(object sender, EventArgs e)
{
RenderTargetBitmap bmp = CreateBitmap(grid, new Size(_renderSize.Width, _renderSize.Height));
if (renderToFile)
{
using (FileStream fs = new FileStream(_filePath, FileMode.Create))
{
BitmapEncoder encoder = GetEncoderByImageFormat(_format, _quality);
encoder.Frames.Add(BitmapFrame.Create(bmp));
encoder.Save(fs);
}
if (_fileCallback != null)
{
_fileCallback(_filePath);
}
}
else
{
if (_bitmapCallback != null)
{
_bitmapCallback(bmp);
}
}
this.Close();
}
/// <summary>
/// Renders to file.
/// </summary>
/// <param name="designSize">Size of the design.</param>
/// <param name="renderSize">Size of the render.</param>
/// <param name="filePath">The file path.</param>
/// <param name="format">The format.</param>
/// <param name="readyCallback">The ready callback.</param>
public void RenderToFile(Size designSize, Size renderSize, String filePath, ImageFormat format, Action<String> readyCallback = null)
{
renderToFile = true;
_renderSize = renderSize;
_filePath = filePath;
_format = format;
_fileCallback = readyCallback;
double scaleX = renderSize.Width / designSize.Width;
double scaleY = scaleX;
this.WindowStyle = WindowStyle.None;
this.AllowsTransparency = true;
this.Opacity = 0.001;
this.ShowInTaskbar = false;
this.ShowActivated = false;
this.Width = 1;
this.Height = 1;
_element.Width = designSize.Width;
_element.Height = designSize.Height;
grid.LayoutTransform = new ScaleTransform(scaleX, scaleY, 0, 0);
this.ContentRendered += RenderWindow_ContentRendered;
this.Show();
}
/// <summary>
/// Renders to file.
/// </summary>
/// <param name="designSize">Size of the design.</param>
/// <param name="renderSize">Size of the render.</param>
/// <param name="filePath">The file path.</param>
/// <param name="format">The format.</param>
/// <param name="readyCallback">The ready callback.</param>
public void RenderToFileSynced(Size designSize, Size renderSize, String filePath, ImageFormat format, int quality, Action<String> readyCallback = null)
{
renderToFile = true;
_renderSize = renderSize;
_filePath = filePath;
_format = format;
_quality = quality;
_fileCallback = readyCallback;
double scaleX = renderSize.Width / designSize.Width;
double scaleY = scaleX;
this.WindowStyle = WindowStyle.None;
this.AllowsTransparency = true;
this.Opacity = 0.001;
this.ShowInTaskbar = false;
this.ShowActivated = false;
this.Width = 1;
this.Height = 1;
_element.Width = designSize.Width;
_element.Height = designSize.Height;
grid.LayoutTransform = new ScaleTransform(scaleX, scaleY, 0, 0);
this.ContentRendered += RenderWindow_ContentRendered;
this.ShowDialog();
}
/// <summary>
/// Renders to bitmap.
/// </summary>
/// <param name="designSize">Size of the design.</param>
/// <param name="renderSize">Size of the render.</param>
/// <param name="readyCallback">The ready callback.</param>
public void RenderToBitmap(Size designSize, Size renderSize, Action<RenderTargetBitmap> readyCallback = null)
{
_renderSize = renderSize;
_bitmapCallback = readyCallback;
double scaleX = renderSize.Width / designSize.Width;
double scaleY = scaleX;
this.WindowStyle = WindowStyle.None;
this.AllowsTransparency = true;
this.Opacity = 0.001;
this.ShowInTaskbar = false;
this.ShowActivated = false;
this.Width = 1;
this.Height = 1;
_element.Width = designSize.Width;
_element.Height = designSize.Height;
grid.LayoutTransform = new ScaleTransform(scaleX, scaleY, 0, 0);
this.ContentRendered += RenderWindow_ContentRendered;
this.Show();
}
/// <summary>
/// Creates the bitmap.
/// </summary>
/// <param name="oVisual">The o visual.</param>
/// <param name="oSize">Size of the o.</param>
/// <returns></returns>
private RenderTargetBitmap CreateBitmap(Visual oVisual, Size oSize)
{
int nWidth = (int)Math.Ceiling(oSize.Width);
int nHeight = (int)Math.Ceiling(oSize.Height);
RenderTargetBitmap oTargetBitmap = new RenderTargetBitmap(
nWidth,
nHeight,
96,
96,
PixelFormats.Pbgra32
);
DrawingVisual oDrawingVisual = new DrawingVisual();
using (DrawingContext oDrawingContext = oDrawingVisual.RenderOpen())
{
VisualBrush oVisualBrush = new VisualBrush(oVisual) { Stretch = Stretch.Fill };
oDrawingContext.DrawRectangle(
oVisualBrush,
null,
new Rect(
new Point(),
new Size(nWidth, nHeight)
)
);
oDrawingContext.Close();
oTargetBitmap.Render(oDrawingVisual);
}
return oTargetBitmap;
}
/// <summary>
/// Gets the encoder by image format.
/// </summary>
/// <param name="format">The format.</param>
/// <returns></returns>
private static BitmapEncoder GetEncoderByImageFormat(ImageFormat format, int quality)
{
BitmapEncoder encoder = null;
if (format == ImageFormat.Png)
{
encoder = new PngBitmapEncoder();
}
else if (format == ImageFormat.Jpeg)
{
encoder = new JpegBitmapEncoder();
(encoder as JpegBitmapEncoder).QualityLevel = quality;
}
else
{
encoder = new BmpBitmapEncoder();
}
return encoder;
}
}
}
|