Skip to content

Instantly share code, notes, and snippets.

@smourier
Created February 3, 2024 10:08
Show Gist options
  • Save smourier/47c7fd54833fc3fbdf01c6fb23ff0024 to your computer and use it in GitHub Desktop.
Save smourier/47c7fd54833fc3fbdf01c6fb23ff0024 to your computer and use it in GitHub Desktop.
Converting SVG to PNG using WIC & Direct2D (through Wicnet & DirectN)
using System.Drawing;
using System.IO;
using DirectN;
using WicNet;
namespace ConsoleApp2
{
internal class Program
{
static void Main()
{
ConvertSvgAsPng("tiger.svg", 200, 200);
}
static void ConvertSvgAsPng(string fileName, int width, int height)
{
using (var memBmp = new WicBitmapSource(width, height, WicPixelFormat.GUID_WICPixelFormat32bppBGR))
{
using (var dc = memBmp.CreateDeviceContext())
{
var dc5 = dc.As<ID2D1DeviceContext5>();
using (var stream = new WicNet.Utilities.UnmanagedMemoryStream(fileName))
{
using (var doc = dc5.CreateSvgDocument(stream, new D2D_SIZE_F(memBmp.Width, memBmp.Height)))
{
dc.BeginDraw();
dc5.DrawSvgDocument(doc.Object);
dc.EndDraw();
}
}
}
memBmp.Save(Path.ChangeExtension(fileName, ".jpg"));
}
}
static void ConvertSvgAsPngUsingDC(string fileName, int width, int height)
{
using (var memBmp = new Bitmap(width, height))
{
using (var fac = D2D1Functions.D2D1CreateFactory())
{
using (var dc = fac.CreateDCRenderTarget(new D2D1_RENDER_TARGET_PROPERTIES
{
type = D2D1_RENDER_TARGET_TYPE.D2D1_RENDER_TARGET_TYPE_SOFTWARE,
usage = D2D1_RENDER_TARGET_USAGE.D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE,
pixelFormat = new D2D1_PIXEL_FORMAT { alphaMode = D2D1_ALPHA_MODE.D2D1_ALPHA_MODE_PREMULTIPLIED, format = DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_UNORM }
}))
{
using (var graphics = Graphics.FromImage(memBmp))
{
dc.Object.BindDC(graphics.GetHdc(), new tagRECT(0, 0, width, height));
var dc5 = dc.As<ID2D1DeviceContext5>();
using (var stream = new WicNet.Utilities.UnmanagedMemoryStream(fileName))
{
using (var doc = dc5.CreateSvgDocument(stream, new D2D_SIZE_F(memBmp.Width, memBmp.Height)))
{
dc.BeginDraw();
dc5.DrawSvgDocument(doc.Object);
dc.EndDraw();
}
}
}
}
memBmp.Save(Path.ChangeExtension(fileName, ".jpg"));
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment