【问题标题】:How to create a `pixelized' SVG image from a bitmap?如何从位图创建“像素化”SVG 图像?
【发布时间】:2011-06-20 00:54:03
【问题描述】:

我有一个 16x16 的位图,并且想要创建一个 SVG,其中包含 16x16 的正方形以及图像像素的颜色。有没有简单的方法来实现这一点?

我目前的想法是使用 Python 和 PIL 读取位图图像并动态创建具有相应对象的 SVG 图像文件。但这感觉有点笨拙,就像重新发明轮子一样。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 我刚刚使用 PIL 破解了一个 Python 脚本来实现我的目标,但问题仍然存在,当然。如果有人关心,我可以在这里发布。
  • 顺便说一下,“像素化”的正式术语是“光栅”。
  • 不是这种情况,因为他想要一个矢量图作为输出。

标签: graphics bitmap svg


【解决方案1】:

如果您不需要输出为 SVG,我建议您使用 HTML5 Canvas,您可以在其中对图像客户端的像素进行采样(在上下文中使用 getImageData()),然后绘制自己的 -缩放图像。或者,如果您需要 SVG,您仍然可以使用 Canvas 进行图像采样,然后在 SVG 中为每个像素使用程序创建的 <rect/> 元素。

我已经写了an example using just HTML Canvas,以便您了解如何执行此操作。简而言之:

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;

如果您真的需要 SVG,我很乐意编写一个动态生成的示例。

编辑:好的,我创建an SVG version 只是为了好玩和练习。 :)

顺便说一句(从最初对您的问题的误读)this demo file from ASVG3 他们的旧SVG Examples Page 展示了如何使用许多不同效果的一些复杂合成来在任意矢量数据上创建像素化。不幸的是,该演示无法在 Chrome 中加载,因为硬连线需要(现已停产)Adobe SVG Viewer

【讨论】:

  • 您的演示在 Chrome 中运行良好,但在 Firefox 3.6 中则完全不运行
  • @Neddy,哪个演示,画布演示还是 SVG 演示?在 FF 3.6.13/Win 7x64(以及 Chrome v8 和 Safari v5)上,我都可以正常工作
  • @Neddy Odd;它也适用于 OS X 上的 FF 3.6。 耸耸肩
  • 非常酷,它们在 chrome 中看起来不同,但 FF 似乎将它们都视为相同(浏览器放大后没有模糊)。
  • 这里是修改后的 Adob​​e 示例,使其可以在现代浏览器中运行:xn--dahlstrm-t4a.net/svg/filters/fePixels.svg
猜你喜欢
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多