The following program loads hello.svg
,
renders it scaled to fit within 640x480 pixels, and writes a
hello.png
file.
Note the following:
rsvg_handle_render_document()
will scale the document proportionally to fit the viewport you specify, and it will center the image within that viewport.Librsvg does not paint a background color by default, so in the following example all unfilled areas of the SVG will appear as fully transparent. If you wish to have a specific background, fill the viewport area yourself before rendering the SVG.
Example 1. Load and render an SVG document as a PNG
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
/* gcc -Wall -g -O2 -o load-and-render load-and-render.c `pkg-config --cflags --libs rsvg-2.0` */ #include <stdlib.h> #include <librsvg/rsvg.h> #define WIDTH 640 #define HEIGHT 480 int main (void) { /* First, load an SVG document into an RsvgHandle */ GError *error = NULL; GFile *file = g_file_new_for_path ("hello.svg"); RsvgHandle *handle = rsvg_handle_new_from_gfile_sync (file, RSVG_HANDLE_FLAGS_NONE, NULL, &error); if (!handle) { g_printerr ("could not load: %s", error->message); exit (1); } /* Create a Cairo image surface and a rendering context for it */ cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT); cairo_t *cr = cairo_create (surface); /* Render the handle scaled proportionally into that whole surface */ RsvgRectangle viewport = { .x = 0.0, .y = 0.0, .width = WIDTH, .height = HEIGHT, }; if (!rsvg_handle_render_document (handle, cr, &viewport, &error)) { g_printerr ("could not render: %s", error->message); exit (1); } /* Write a PNG file */ if (cairo_surface_write_to_png (surface, "hello.png") != CAIRO_STATUS_SUCCESS) { g_printerr ("could not write output file"); exit (1); } /* Free our memory and we are done! */ cairo_destroy (cr); cairo_surface_destroy (surface); g_object_unref (handle); g_object_unref (file); return 0; } |