微信小程序图片使用滤镜工具weImageFilters使用记录

 哎~~~~~~这是一个没有尽头的小程序项目,要做什么从来没有做调研和计划,想到就要做,实在是无语,还TM说怕别人抄袭~呵呵~想想都想笑。这次又搞事了,想在小程序中处理图片后传给雕刻机进行雕刻。这边要做的就是调节图片的灰度、亮度。

参考文章:

微信小程序滤镜工具weImageFilters - 简书 (jianshu.com)

我就是参考上面这位大佬的文章,自己进行了一些修改就满足了我的需求

我在imagefilters.js里添加了一个新的DitherBrightnessContrast 方法,将GrayScale (srcImageData) 灰度、BrightnessContrastPhotoshop (srcImageData, brightness, contrast) 亮度、对比度、Dither (srcImageData, levels) 高频振动功能整合在了一起

ImageFilters.DitherBrightnessContrast = function (srcImageData, levels, brightness, contrast) {
  var srcWidth = srcImageData.width,
      srcHeight = srcImageData.height,
      dstImageData = this.utils.createImageData(srcWidth, srcHeight),
      dstPixels = dstImageData.data,
      srcPixels = srcImageData.data,
      srcLength = srcPixels.length,
      p4 = Math.PI / 4;

  // Convert to grayscale and store in dstPixels
  for (var i = 0; i < srcLength; i += 4) {
      var intensity = (srcPixels[i] * 19595 + srcPixels[i + 1] * 38470 + srcPixels[i + 2] * 7471) >> 16;
      dstPixels[i] = dstPixels[i + 1] = dstPixels[i + 2] = intensity;
      dstPixels[i + 3] = srcPixels[i + 3];
  }

  brightness /= 100;
  contrast = (contrast * 0.99) / 100;
  contrast = Math.tan((contrast + 1) * p4);

  var avg = 0;
  for (var j = 0; j < srcLength; j += 4) {
      avg += dstPixels[j];
  }
  avg /= srcLength / 4;

  this.utils.mapRGB(dstPixels, dstPixels, function (value) {
      if (brightness < 0) {
          value *= (1 + brightness);
      } else if (brightness > 0) {
          value += (255 - value) * brightness;
      }

      if (contrast !== 0) {
          value = (value - avg) * contrast + avg;
      }
      return value + 0.5 | 0;
  });

  levels = Math.min(Math.max(levels, 2), 255);

  var levelMap = [];
  var a = 0;
  var b = 0;
  for (var c = 0; c < levels; c += 1) {
      levelMap[c] = (255 * c) / (levels - 1);
  }

  var posterize = this.utils.buildMap(function (value) {
      var ret = levelMap[a];
      b += levels;
      if (b > 255) {
          b -= 255;
          a += 1;
      }
      return ret;
  });

  var x, y, index, old_r, old_g, old_b, new_r, new_g, new_b, err_r, err_g, err_b, nbr_r, nbr_g, nbr_b;
  var srcWidthMinus1 = srcWidth - 1, srcHeightMinus1 = srcHeight - 1;
  var A = 7 / 16, B = 3 / 16, C = 5 / 16, D = 1 / 16;

  for (y = 0; y < srcHeight; y += 1) {
      for (x = 0; x < srcWidth; x += 1) {
          index = (y * srcWidth + x) << 2;
          old_r = dstPixels[index];
          old_g = dstPixels[index + 1];
          old_b = dstPixels[index + 2];

          new_r = posterize[old_r];
          new_g = posterize[old_g];
          new_b = posterize[old_b];

          dstPixels[index] = new_r;
          dstPixels[index + 1] = new_g;
          dstPixels[index + 2] = new_b;

          err_r = old_r - new_r;
          err_g = old_g - new_g;
          err_b = old_b - new_b;

          index += 1 << 2;
          if (x < srcWidthMinus1) {
              nbr_r = dstPixels[index] + A * err_r;
              nbr_g = dstPixels[index + 1] + A * err_g;
              nbr_b = dstPixels[index + 2] + A * err_b;

              dstPixels[index] = nbr_r > 255 ? 255 : nbr_r < 0 ? 0 : nbr_r | 0;
              dstPixels[index + 1] = nbr_g > 255 ? 255 : nbr_g < 0 ? 0 : nbr_g | 0;
              dstPixels[index + 2] = nbr_b > 255 ? 255 : nbr_b < 0 ? 0 : nbr_b | 0;
          }

          index += (srcWidth - 2) << 2;
          if (x > 0 && y < srcHeightMinus1) {
              nbr_r = dstPixels[index] + B * err_r;
              nbr_g = dstPixels[index + 1] + B * err_g;
              nbr_b = dstPixels[index + 2] + B * err_b;

              dstPixels[index] = nbr_r > 255 ? 255 : nbr_r < 0 ? 0 : nbr_r | 0;
              dstPixels[index + 1] = nbr_g > 255 ? 255 : nbr_g < 0 ? 0 : nbr_g | 0;
              dstPixels[index + 2] = nbr_b > 255 ? 255 : nbr_b < 0 ? 0 : nbr_b | 0;
          }

          index += 1 << 2;
          if (y < srcHeightMinus1) {
              nbr_r = dstPixels[index] + C * err_r;
              nbr_g = dstPixels[index + 1] + C * err_g;
              nbr_b = dstPixels[index + 2] + C * err_b;
              
              dstPixels[index] = nbr_r > 255 ? 255 : nbr_r < 0 ? 0 : nbr_r | 0;
              dstPixels[index + 1] = nbr_g > 255 ? 255 : nbr_g < 0 ? 0 : nbr_g | 0;
              dstPixels[index + 2] = nbr_b > 255 ? 255 : nbr_b < 0 ? 0 : nbr_b | 0;
          }
      }
  }

  // Finally, return the processed image data
  return dstImageData;
};

就这样吧~~有问题再说!!

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值