首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >canvas ImageData删除白色像素

canvas ImageData删除白色像素
EN

Stack Overflow用户
提问于 2011-07-20 07:25:51
回答 4查看 8.9K关注 0票数 8

我有一些有白色背景的html格式的图像。我需要去掉白色背景。我在想,我可以让所有的白色像素透明,但我不知道怎么做。我只想使用html/javascript。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-20 08:29:59

下面是如何做到这一点。

代码语言:javascript
复制
function white2transparent(img)
{
    var c = document.createElement('canvas');

    var w = img.width, h = img.height;

    c.width = w;
    c.height = h;

    var ctx = c.getContext('2d');

    ctx.drawImage(img, 0, 0, w, h);
    var imageData = ctx.getImageData(0,0, w, h);
    var pixel = imageData.data;

    var r=0, g=1, b=2,a=3;
    for (var p = 0; p<pixel.length; p+=4)
    {
      if (
          pixel[p+r] == 255 &&
          pixel[p+g] == 255 &&
          pixel[p+b] == 255) // if white then change alpha to 0
      {pixel[p+a] = 0;}
    }

    ctx.putImageData(imageData,0,0);

    return c.toDataURL('image/png');
}

要使用它,请将图像的src设置为此方法的返回值。

代码语言:javascript
复制
var someimage = document.getElementById('imageid');
someimage.src = white2transparent(someimage);

http://jsfiddle.net/gaby/UuCys/

要使此代码正常工作,图像必须来自与代码相同的域(出于安全原因)。

票数 16
EN

Stack Overflow用户

发布于 2013-06-28 03:25:15

不使用JPG,而是在图像周围使用具有透明背景的PNG。你会得到一个更好的结果。

票数 1
EN

Stack Overflow用户

发布于 2011-07-20 07:31:26

从带有"getImageData“的画布对象返回的图像数据只是RGBA像素信息-即红色、绿色、蓝色和alpha透明度。因此,您可以获得图像数据并遍历,一次查看四个像素。当你看到一个白色的时候,你可以将它置零(和alpha值一起)。

现在的问题是,你不会对结果感到满意,因为在非白色元素周围仍然会有一个“光环”。原始图像(可能)在彩色区域的边缘略微模糊,有效地消除了锯齿。因此,沿着边缘的像素比主图像稍微亮一些,在删除所有纯白色的像素后,您将看到这些像素仍然存在。

要真正清理边缘是相当棘手的,这取决于你得到的是哪种类型的源图像。我不认为它是尖端的图像处理或任何东西,但它不是微不足道的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6755314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档