3

我遇到了这种情况,我很难在谷歌上搜索并解释。

我们公司在铝上打印照片,我们给客户两种选择。

  1. 第一种选择是将他们的图片打印在铝上,就像他们给我们的图片一样,所以如果图片有白色背景,则图片会以白色背景打印。就这么轻松。

  2. 第二个选项是我们可以在不使用白色的情况下打印他们的图片。而不是打印所有“白色值”(<-我能想到的最好的解释),我们让它保持透明。

我知道织物 JS 中有这个 removeWhite 过滤器,它可以用透明区域替换白色区域。但这不是我需要的。我需要一个 Fabric JS 过滤器、ImageMagick 东西或任何其他可以将像素的“白色值”变为透明的 PHP 或 JS 解决方案。我知道这些东西对你们来说可能听起来很模糊,但让我试着用这种方式解释:

  • 如果我遇到一个白色像素,我需要让它透明。

  • 如果我遇到一个灰色像素,我需要将它从白色和黑色的组合变成透明和黑色的组合。

  • 如果我穿过一个彩色像素,我还需要将“白色值”转为透明。

这是我尝试完成的过滤器/效果的前后示例:

前:

后:

如果您不明白我的要求,请随时问我任何问题。

4

2 回答 2

3

我让它工作。通过使用YUV颜色空间中的因素,我可以创建一个 Fabric JS 图像过滤器。

得到我正在寻找的结果需要大量的反复试验。因此,我没有(详细)描述它是如何工作的。据我所知,我使用 YUV 因子来获得(RGB)颜色的亮度。

for (i = 0; i < iLen; i++) {
    for (j = 0; j < jLen; j++) {
      index = (i * 4) * jLen + (j * 4);
      var yuv = {};
      yuv.r = data[index] / 255 * 1 * 0.299;     
      yuv.g = data[index + 1] / 255 * 1 * 0.587; //we use the yuv formula constants
      yuv.b = data[index + 2] / 255 * 1 * 0.114; //to try to catch the Y (brightness)
      yuv.y = yuv.r + yuv.g + yuv.b;             //you can tweak this
      data[index + 3] = 350 - (yuv.y / 1 * 255); //by changing the first number after the "=" on this line!
    }
}

不知何故,通过弄乱最后一行的 350,您可以更改透明度因子。

很抱歉无法解释有关此 Fabric 过滤器如何工作的更多信息。

于 2013-05-21T09:21:52.927 回答
1

所以 Fabric.js 中有一个过滤器可以做到这一点。

http://fabricjs.com/docs/fabric.Image.filters.RemoveWhite.html

var filter = new fabric.Image.filters.RemoveWhite({
  threshold: 40,
  distance: 140
});
image.filters.push(filter);
image.applyFilters(canvas.renderAll.bind(canvas));
于 2016-08-11T22:12:38.860 回答