exporting plot to png.
vdepa wrote at 2012-03-02 12:13:
Hi all,
Can anyone please share code for exporting plot to png from the step onwards.
It's very urgent to me.
Please help.
ffiala wrote at 2012-03-02 22:40:
This is my file "BitmapRenderContext.cs" which is originally copied from SvgRenderContext.cs substituting the calls to svg writer through calls to Graphic class. This Class returns a Bitmap.
// -------------------------------------------------------------------------------------------------------------------- // // http://oxyplot.codeplex.com, license: Ms-PL // // -------------------------------------------------------------------------------------------------------------------- namespace OxyPlot { using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Text; /// /// The Bitmap render context. /// public class BitmapRenderContext : RenderContextBase, IDisposable { #region Constants and Fields public Bitmap objBmpImage; Graphics objGraphics; #endregion #region Constructors and Destructors /// /// Initializes a new instance of the class. /// /// <param name="s" /> /// The s. /// /// <param name="width" /> /// The width. /// /// <param name="height" /> /// The height. /// /// <param name="isDocument" /> /// The is document. /// public BitmapRenderContext(double width, double height) { this.Width = width; this.Height = height; this.PaintBackground = true; objBmpImage = new Bitmap((int)width, (int)height); objGraphics = Graphics.FromImage(objBmpImage); objGraphics.Clear(Color.White); objGraphics.SmoothingMode = SmoothingMode.AntiAlias; objGraphics.TextRenderingHint = TextRenderingHint.AntiAlias; } #if !METRO /// /// Initializes a new instance of the class. /// /// <param name="path" /> /// The path. /// /// <param name="width" /> /// The width. /// /// <param name="height" /> /// The height. /// public BitmapRenderContext(string path, double width, double height) { } #endif #endregion #region Public Methods /// /// The close. /// public void Close() { } /// /// The complete. /// public void Complete() { } /// /// The dispose. /// public void Dispose() { objBmpImage.Dispose(); } /// /// The draw ellipse. /// /// <param name="rect" /> /// The rect. /// /// <param name="fill" /> /// The fill. /// /// <param name="stroke" /> /// The stroke. /// /// <param name="thickness" /> /// The thickness. /// public override void DrawEllipse(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness) { Pen pen = stroke == null ? null : new Pen(Color.FromArgb(stroke.A, stroke.R, stroke.G, stroke.B), (int)thickness); Rectangle grect = new Rectangle((int)rect.Left, (int)rect.Top, (int)rect.Width, (int)rect.Height); SolidBrush brush = fill == null ? null : new SolidBrush(Color.FromArgb(fill.A, fill.R, fill.G, fill.B)); if (pen != null) objGraphics.DrawEllipse(pen, grect); if (brush != null) objGraphics.FillEllipse(brush, grect); } /// /// The draw line. /// /// <param name="points" /> /// The points. /// /// <param name="stroke" /> /// The stroke. /// /// <param name="thickness" /> /// The thickness. /// /// <param name="dashArray" /> /// The dash array. /// /// <param name="lineJoin" /> /// The line join. /// /// <param name="aliased" /> /// The aliased. /// public override void DrawLine( IList points, OxyColor stroke, double thickness, double[] dashArray, OxyPenLineJoin lineJoin, bool aliased) { Point[] Gpoints = new Point[points.Count]; for (int i=0; i /// The draw polygon. /// /// <param name="points" /> /// The points. /// /// <param name="fill" /> /// The fill. /// /// <param name="stroke" /> /// The stroke. /// /// <param name="thickness" /> /// The thickness. /// /// <param name="dashArray" /> /// The dash array. /// /// <param name="lineJoin" /> /// The line join. /// /// <param name="aliased" /> /// The aliased. /// public override void DrawPolygon( IList points, OxyColor fill, OxyColor stroke, double thickness, double[] dashArray, OxyPenLineJoin lineJoin, bool aliased) { Point[] Gpoints = new Point[points.Count]; for (int i = 0; i < points.Count; i++) { Gpoints[i].X = (int)points[i].X; Gpoints[i].Y = (int)points[i].Y; } Pen pen = stroke == null ? null : new Pen(Color.FromArgb(stroke.A, stroke.R, stroke.G, stroke.B), (int)thickness); if (pen != null) objGraphics.DrawPolygon(pen, Gpoints); SolidBrush brush = fill == null ? null : new SolidBrush(Color.FromArgb(fill.A, fill.R, fill.G, fill.B)); if (brush != null) objGraphics.FillPolygon(brush, Gpoints); } /// /// The draw rectangle. /// /// <param name="rect" /> /// The rect. /// /// <param name="fill" /> /// The fill. /// /// <param name="stroke" /> /// The stroke. /// /// <param name="thickness" /> /// The thickness. /// public override void DrawRectangle(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness) { Pen pen = stroke==null ? null : new Pen(Color.FromArgb(stroke.A,stroke.R,stroke.G,stroke.B), (int)thickness); Rectangle grect = new Rectangle((int)rect.Left, (int)rect.Top, (int)rect.Width, (int)rect.Height); SolidBrush brush = fill == null ? null : new SolidBrush(Color.FromArgb(fill.A, fill.R, fill.G, fill.B)); if (pen!=null) objGraphics.DrawRectangle(pen, grect); if (brush != null) objGraphics.FillRectangle(brush, grect); } /// /// The draw text. /// /// <param name="p" /> /// The p. /// /// <param name="text" /> /// The text. /// /// <param name="c" /> /// The c. /// /// <param name="fontFamily" /> /// The font family. /// /// <param name="fontSize" /> /// The font size. /// /// <param name="fontWeight" /> /// The font weight. /// /// <param name="rotate" /> /// The rotate. /// /// <param name="halign" /> /// The halign. /// /// <param name="valign" /> /// The valign. /// /// <param name="maxSize" /> /// Max size of the text (clipping rectangle). /// public override void DrawText( ScreenPoint p, string text, OxyColor c, string fontFamily, double fontSize, double fontWeight, double rotate, HorizontalTextAlign halign, VerticalTextAlign valign, OxySize? maxSize) { double SizeCorrectingFactor = 0.8; double VerticalCorrectingFactor = fontSize * 0.3; Point Gp = new Point((int)(p.X-VerticalCorrectingFactor), (int)(p.Y)); Font font = new Font(fontFamily,(float)(fontSize*SizeCorrectingFactor), FontStyle.Regular); SolidBrush brush = c == null ? null : new SolidBrush(Color.FromArgb(c.A, c.R, c.G, c.B)); StringFormat stringFormat = new StringFormat(); /* dont know how to vertically align text, so this setting is skipped */ if (brush != null) { if (Math.Abs(rotate) < 0.1) { switch (halign) { case HorizontalTextAlign.Center: stringFormat.Alignment = StringAlignment.Center; break; case HorizontalTextAlign.Left: stringFormat.Alignment = StringAlignment.Near; break; case HorizontalTextAlign.Right: stringFormat.Alignment = StringAlignment.Far; break; } objGraphics.DrawString(text, font, brush, Gp, stringFormat); } else { switch (halign) { case HorizontalTextAlign.Center: stringFormat.Alignment = StringAlignment.Center; break; case HorizontalTextAlign.Left: stringFormat.Alignment = StringAlignment.Near; break; case HorizontalTextAlign.Right: stringFormat.Alignment = StringAlignment.Far; break; } stringFormat.Alignment = StringAlignment.Far; SizeF size = objGraphics.MeasureString(text, font); Bitmap tempImage = new Bitmap((int)(size.Height * 1.2), (int)(size.Width * 1.2)); Graphics tempGraphics = Graphics.FromImage(tempImage); tempGraphics.TextRenderingHint = TextRenderingHint.AntiAlias; tempGraphics.SmoothingMode = SmoothingMode.AntiAlias; Rectangle rect = new Rectangle((int)tempGraphics.VisibleClipBounds.X, (int)tempGraphics.VisibleClipBounds.Y, (int)tempGraphics.VisibleClipBounds.Width, (int)tempGraphics.VisibleClipBounds.Height); tempGraphics.TranslateTransform(0, 0); tempGraphics.RotateTransform(270); tempGraphics.DrawString(text, font, brush, new PointF(0, 0), stringFormat); objGraphics.DrawImage(tempImage, Gp); objGraphics.DrawImage(tempImage, Gp); tempGraphics.Dispose(); tempImage.Dispose(); } } } /// /// The flush. /// public void Flush() { objGraphics.Flush(); } /// /// The measure text. /// /// <param name="text" /> /// The text. /// /// <param name="fontFamily" /> /// The font family. /// /// <param name="fontSize" /> /// The font size. /// /// <param name="fontWeight" /> /// The font weight. /// /// /// public override OxySize MeasureText(string text, string fontFamily, double fontSize, double fontWeight) { if (string.IsNullOrEmpty(text)) { return OxySize.Empty; } // todo: should improve text measuring, currently using p/invoke on GDI32 // is it better to use winforms or wpf text measuring? return Gdi32.MeasureString(fontFamily, (int)fontSize, (int)fontWeight, text); } #endregion } }
In PlotModel.cs the following method is added:
/// /// Create a Drawing /// /// <param name="width" /> /// The width. /// /// <param name="height" /> /// The height. /// /// <param name="isDocument" /> /// if set to true [is document]. /// /// /// The to svg. /// public Bitmap ToBitmap(double width, double height) { var bmrc = new BitmapRenderContext(width, height); this.Update(); this.Render(bmrc); bmrc.Complete(); bmrc.Flush(); return (bmrc.objBmpImage); }
To send the image to the client:
Response.Clear(); Response.ContentType = "image/png"; Bitmap bmp = plot.GetBitmap(800, 500); bmp.Save(Response.OutputStream, ImageFormat.Png);
In this version only solid lines are rendered.
Franz
vdepa wrote at 2012-03-06 19:06:
Hi fmoses,
I am unable to save the png. The above code is not working at the draw line.
I writting the below sample code for testing. I have used plot model and plot as in the example
Can you please correct the mistake in the below code. XAML Code:
C# Code :
using OxyPlot;
using OxyPlot.Wpf;
try
{
InitializeComponent(); Model = TwoLineSeries();
DataContext = this; Plot objPlot = this.plot1;
var path = GetFilename(".png files|*.png", ".png");
if (path != null) { objPlot.SaveBitmap(path); } } catch (Exception ex) { string abc = ex.Message.ToString(); }
public static PlotModel TwoLineSeries()
{
var model = new PlotModel();
OxyPlot.LinearAxis abcd = new OxyPlot.LinearAxis();
abcd.Key = "Hours";
abcd.Position = AxisPosition.Left;
abcd.Title = "Hours";
abcd.MajorGridlineStyle = LineStyle.Solid;
model.Axes.Add(abcd);
OxyPlot.LinearAxis abc = new OxyPlot.LinearAxis();
abc.Key = "Men";
abc.Position = AxisPosition.Bottom;
abc.Title = "Men"; model.Axes.Add(abc);
var s1 = new OxyPlot.LineSeries("Series 1")
{
Color = OxyColors.SkyBlue, };
s1.YAxisKey = abcd.Key; for (int i = 0; i < 300; i++)
{
s1.Points.Add(new DataPoint(i, i + 10));
}
model.LegendPlacement = LegendPlacement.Outside;
model.LegendOrientation = LegendOrientation.Horizontal;
return model;
Please help me.
Thanks & Regards
vdepa
Customer support service by UserEcho