Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a `pixelized' SVG image from a bitmap?

I have a 16x16 bitmap and want to create an SVG that contains 16x16 squares with the colors of the pixels of the image. Is there an easy way to achieve this?

My current thoughts go into the direction of using Python and PIL to read the bitmap image and dynamically create an SVG image file with the corresponding objects. But this feels a little clumsy and like reinventing the wheel.

Is there a better way to do this?

like image 501
hochl Avatar asked Feb 02 '11 14:02

hochl


People also ask

Can you convert a bitmap to vector?

To convert a bitmap to vectors: Select the 2D View tab to display the bitmap in the 2D view. Select Vector > Bitmap to Vector or click the Bitmap to Vector button. The Bitmap to Vector panel is displayed.

Is SVG pixel based?

So how does the SVG format differ to bitmap-based images? They are vector-based meaning that they are resolution independent. Rather than consisting of pixels, SVG images consist of shapes. This means that they can scale indefinitely without a reduction of quality.

How to improve picture quality In Inkscape?

If you'd like to sharpen your image further, you can go to Filters > Image Effects > Sharpen or Sharpen More. This is how you can sharpen an image in Inkscape.

How do I change the resolution of an image in Inkscape?

enter desired size (you can change the units in the drop down box. in the export tool choose the desired resolution (96 dpi for on-screen-display, 300 dpi for printing; the number of pixels will adjust accordingly.


1 Answers

If you don't need the output to be SVG, I would suggest using an HTML5 Canvas where you can sample the pixels of the image client-side (using getImageData() on the context) and then draw your own up-scaled image. Or, if you need SVG, you could still use Canvas for the image sampling and then use procedurally-created <rect/> elements in SVG for each pixel.

I've written an example using just HTML Canvas so you can see how to do this. In short:

function drawPixelated(img,context,zoom,x,y){
  if (!zoom) zoom=4; if (!x) x=0; if (!y) y=0;
  if (!img.id) img.id = "__img"+(drawPixelated.lastImageId++);
  var idata = drawPixelated.idataById[img.id];
  if (!idata){
    var ctx = document.createElement('canvas').getContext('2d');
    ctx.width  = img.width;
    ctx.height = img.height;
    ctx.drawImage(img,0,0);
    idata = drawPixelated.idataById[img.id] = ctx.getImageData(0,0,img.width,img.height).data;
  }
  for (var x2=0;x2<img.width;++x2){
    for (var y2=0;y2<img.height;++y2){
      var i=(y2*img.width+x2)*4;
      var r=idata[i  ];
      var g=idata[i+1];
      var b=idata[i+2];
      var a=idata[i+3];
      context.fillStyle = "rgba("+r+","+g+","+b+","+(a/255)+")";
      context.fillRect(x+x2*zoom, y+y2*zoom, zoom, zoom);
    }
  }
};
drawPixelated.idataById={};
drawPixelated.lastImageId=0;

If you really need SVG involved, I'd be happy to write an example that dynamically generated that.

Edit: OK, I've created an SVG version just for fun and practice. :)

As an aside (from an initial misreading of your question) this demo file from ASVG3 their old SVG Examples Page shows how to use some complex compositing of many different effects to create pixelation on arbitrary vector data. Unfortunately the demo does not load in Chrome, having been hardwired to require the (now-discontinued) Adobe SVG Viewer.

like image 153
Phrogz Avatar answered Nov 09 '22 22:11

Phrogz