滤镜,如此简单

607 阅读3分钟
  图像处理中,滤镜是一个很常用的处理方法。今天我将带领大家一起走进图片滤镜的世界,其实,滤镜是如此的简单。先看看我们今天要实现的几个效果图对比吧:

底片滤镜

  底片滤镜就是将图像处理成照片底片的样式。
  其算法很简单,就是对色彩进行反转,即用255减去每个像素的RGB分量。

private void negative(Bitmap bitmap){
  int width = bitmap.getWidth();
  int height = bitmap.getHeight();
  Bitmap filterBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  for (int i = 0; i < width; i++ ) {
    for(int j = 0; j < height; j++) {
      int color = originalBitmap.getPixel(i, j);
      int red = 255 - Color.red(color);
      int green = 255 - Color.green(clr);
      int blue = 255 - Color.blue(clr);
      int newColor = Color.rgb(red, green, blue);
      filterBitmap.setPixel(i, j, newColor);
    }
  }
  return filterBitmap;
}

雕刻滤镜

  雕刻滤镜就是将图像上的物体嵌入背景中,看起来像是雕刻一样的效果。
  其算法是对图像上的一个像素和该像素左上方的像素之差再加上一个常数(为了保持图片的灰度,可加灰度常数128)的一种处理过程。

public static Bitmap sculpture(Bitmap originalBitmap) {
  int width = originalBitmap.getWidth();
  int height = originalBitmap.getHeight();
  Bitmap filterBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  for (int i = width; i > 0; i--) {
    for (int j = height; j > 0; j--) {
      int color1 = originalBitmap.getPixel(i, j);  //当前像素
      int color2 = originalBitmap.getPixel(i - 1, j - 1);  //左上角像素
      int red = Math.max(67, Math.min(255, Math.abs(Color.red(color1) - Color.red(color2) + 128)));
      int green = Math.max(67, Math.min(255, Math.abs(Color.green(color1) - Color.green(color2) + 128)));
      int blue = Math.max(67, Math.min(255, Math.abs(Color.blue(color1) - Color.blue(color2) + 128)));
      int newColor = Color.rgb(red, green, blue);
      filterBitmap.setPixel(i, j, newColor);
    }
  }
  return filterBitmap;
}

浮雕滤镜

  与雕刻滤镜相反,浮雕滤镜是将图像上的物体从背景中凸出来,以实现浮雕效果。
  其算法是对图像上的一个像素和该像素右下方的像素之差再加上一个常数的一种处理过程。

public static Bitmap cameo(Bitmap originalBitmap) {
  int width = originalBitmap.getWidth();
  int height = originalBitmap.getHeight();
  Bitmap filterBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  for (int i = 0; i < width - 1; i++) {
    for (int j = 0; j < height - 1; j++) {
      int color1 = originalBitmap.getPixel(i, j);  //当前像素
      int color2 = originalBitmap.getPixel(i + 1, j + 1);  //右下角像素
      int red = Math.max(67, Math.min(255, Math.abs(Color.red(color1) - Color.red(color2) + 128)));
      int green = Math.max(67, Math.min(255, Math.abs(Color.green(color1) - Color.green(color2) + 128)));
      int blue = Math.max(67, Math.min(255, Math.abs(Color.blue(color1) - Color.blue(color2) + 128)));
      int newColor = Color.rgb(red, green, blue);
      filterBitmap.setPixel(i, j, newColor);
    }
  }
  return filterBitmap;
}

美白滤镜

  最后,为大家带来一个美白滤镜的效果。

public static Bitmap whitening(Bitmap originalBitmap) {
  final float brightness = 0.2f; //亮度
  final float contrainst = 0.2f; //对比度,颜色加深
  int bab = (int) (255 * brightness);
  float ca = 1.0f + contrainst;
  int width = originalBitmap.getWidth();
  int height = originalBitmap.getHeight();
  Bitmap filterBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  for (int i = 0; i < width ; i++) {
    for (int j = 0; j < height ; j++) {
      int color = originalBitmap.getPixel(i, j);
      int red = Color.red(color);
      int green = Color.green(color);
      int blue = Color.blue(color);
      //美白
      int ri = red + bab;
      int gi = green + bab;
      int bi = blue + bab;
      //边界检测
      red = ri > 255 ? 255 : (ri < 0 ? 0 : ri);
      green = gi > 255 ? 255 : (gi < 0 ? 0 : gi);
      blue = bi > 255 ? 255 : (bi < 0 ?0 : bi);
      //扩大对比度,需要白的更白,黑的更黑,即128以上加强,128以下再减
      ri = red - 128;
      gi = green - 128;
      bi = blue - 128;
      ri = (int) (ri * ca) + 128;
      gi = (int) (gi * ca) + 128;
      bi = (int) (bi * ca) + 128;
      //边界检测
      red = ri > 255 ? 255 : (ri<0?0:ri);
      green = gi > 255 ? 255 : (gi<0?0:gi);
      blue = bi > 255 ? 255 : (bi<0?0:bi);
      int newColor = Color.rgb(red, green, blue);
      filterBitmap.setPixel(i, j, newColor);
    }
  }
  return filterBitmap;
}