I was just in the progress of building my own (see code below), but yours works great with the extra option for file type.
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Text;
using System.Windows.Forms;
namespace PaintDotNet.Plugin.FileTypes
{
/// <summary>
/// Base64 file type
/// </summary>
public class Base64FileType : FileType
{
#region Constructor;
/// <summary>
/// Base64 file type
/// </summary>
public Base64FileType() : base("Base64", FileTypeFlags.SupportsLoading | FileTypeFlags.SupportsSaving, new String[] { ".txt" }) { }
#endregion Constructor;
#region Override;
/// <summary>
/// Open file
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
protected override Document OnLoad(Stream input)
{
try
{
// Convert byte[] string to Base64;
StreamReader reader = new StreamReader(input);
String base64String = reader.ReadToEnd();
base64String = base64String.Replace("data:image/png;base64,", "");
// Convert Base64 string to byte[];
byte[] imageBytes = Convert.FromBase64String(base64String);
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
// Convert byte[] to Image;
ms.Write(imageBytes, 0, imageBytes.Length);
Image image = Image.FromStream(ms, true);
return Document.FromImage(image);
}
catch
{
MessageBox.Show("Problem Importing File");
Bitmap b = new Bitmap(500, 500);
return Document.FromImage(;
}
}
/// <summary>
/// Save file
/// </summary>
/// <param name="input"></param>
/// <param name="output"></param>
/// <param name="token"></param>
/// <param name="scratchSurface"></param>
/// <param name="callback"></param>
protected override void OnSave(Document input, Stream output, SaveConfigToken token, Surface scratchSurface, ProgressEventHandler callback)
{
RenderArgs ra = new RenderArgs(new Surface(input.Size));
input.Render(ra, true);
using (MemoryStream ms = new MemoryStream())
{
// Convert Image to byte[];
ra.Bitmap.Save(ms, ImageFormat.Gif);
Byte[] imageBytes = ms.ToArray();
// Convert byte[] to Base64 string;
String base64String = "data:image/png;base64," + Convert.ToBase64String(imageBytes);
// Convert Base64 string to byte[];
ASCIIEncoding encoding = new ASCIIEncoding();
Byte[] stringBytes = encoding.GetBytes(base64String);
// Save to stream;
output.Write(stringBytes, 0, stringBytes.Length);
}
}
#endregion Override;
}
public class Base64FileTypeFactory : IFileTypeFactory
{
public FileType[] GetFileTypeInstances()
{
return new FileType[] { new Base64FileType() };
}
}
}