Svg / Png converter

Hi,
I’m trying to build a SVG image with vg into a buffer, convert it to PNG, do some stuff over pixels and rebuild a new SVG from it, still into a buffer.

Example:

module type ImageManipulator : sig
  type svg
  type png 
  val svg_of_string : string -> svg
  val svg_of_png : png -> svg
  val png_of_svg : svg -> png
  val string_of_svg : svg -> string 
end

module I : ImageManipulator = struct .... end

let manipulate str =
  let svg = I.svg_of_string str in
  let png = I.png_of_svg svg in
  let png = (* Manipulation sur le type png *) in
  I.svg_of_png png |> I.string_of_svg

Is there an Ocaml library that allows to convert a PNG format to a SVG format into a buffer and vice versa (an equivalent of the ImageManipulator describes above)?

Not sure I understood what you wanted. But here’s an example on how to render a PNG inside a SVG image.

Thanks for your answer! This isn’t exactly what I’m trying to do.

I’m working on the learn-ocaml platform. My main goal is to compare two images generated with vg. To do so, I wanted to check the pixel matrixes, created thanks to cairo2 and build a third image, in grayscale, corresponding to the difference between the two images.

My problem is that I can’t save the generated image in any file: it must stay only in the ram memory. However, I need to get this image and insert it into the web page. I can’t insert some PNG code directly into the page without saving it into a file. The only way I’ve found is to get the SVG code from the PNG and insert this SVG into the html DOM.

I don’t know how I can convert the pixel matrix into a SVG code or if it exists a method to directly inject PNG content… Is there any way to do it ?

You should be able to this by base64 encoding the in-memory representation of the png and inject it via a data uri in the DOM see here.

In fact the Vg image database does that so that you can download the various rendered examples by clicking on the surface, e.g. SVG, PDF.

That’s exactly what I was looking. Thanks so much for your help !