一句话,滤镜的实现就是对像素点(RGBA)进行再运算,输出新的像素点。    F(r,g,b,a)=G(r,g,b,a);

这个公式包含四个变换,即RGB颜色空间中RGB三个分量的变换以及透明度Alhpa的变换,这里我们简写为A的变换。

举个灰度变换的例子,它对应的F——G变换如下:

F(r) = b * 0.114 + g * 0.587 + r * 0.299;

F(g) = b * 0.114 + g * 0.587 + r * 0.299;

F(b) = b * 0.114 + g * 0.587 + r * 0.299;

F(a) = a;

这个灰度化也就是一个基本变换。有了这个基本变换,图像也就达到了一定的效果,但是,一些复杂的滤镜,并非简单的基本变换,而是一些复杂的效果叠加,也就说

这个G函数是多个函数的联合体。

还有一种方法,对于一些滤镜产品,我们直观看到的滤镜效果是已经生成的新像素点组成,也就是说如果我们想破解这种滤镜,

我们可以通过颜色映射构建一个映射表,然后通过查表来快速实现该变换效果,

这种万能滤镜破解的方法,请参考 http://blog.csdn.net/trent1985/article/details/42212459

本人看了以上博主的很多滤镜相关的博文,得到很多启发(感谢!)

以下是Java实现Lomo效果的代码,可以直接用。

public static void Lomo(String fromPath, String toPath) throws IOException {

BufferedImage fromImage = ImageIO.read(new File(fromPath));

int width = fromImage.getWidth();
int height = fromImage.getHeight();
BufferedImage toImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

int a, r, g, b, grayValue = 0;

for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int rgb = fromImage.getRGB(i, j);
// 过滤
a = rgb & 0xff000000;
r = (rgb & 0xff0000) >> 16;
g = (rgb & 0xff00) >> 8;
b = (rgb & 0xff);

b = ModeSmoothLight(b, b);
g = ModeSmoothLight(g, g);
r = ModeSmoothLight(r, r);
b = ModeExclude(b, 80);
g = ModeExclude(g, 15);
r = ModeExclude(r, 5);

grayValue = a | (r << 16) | (g << 8) | b;
toImage.setRGB(i, j, grayValue);
}
}
ImageIO.write(toImage, "jpg", new File(toPath));
}

private static int ModeSmoothLight(int basePixel, int mixPixel) {
int res = 0;
res = mixPixel > 128
? ((int) ((float) basePixel + ((float) mixPixel + (float) mixPixel - 255.0f)
* ((Math.sqrt((float) basePixel / 255.0f)) * 255.0f - (float) basePixel) / 255.0f))
: ((int) ((float) basePixel + ((float) mixPixel + (float) mixPixel - 255.0f)
* ((float) basePixel - (float) basePixel * (float) basePixel / 255.0f) / 255.0f));
return Math.min(255, Math.max(0, res));
}

private static int ModeExclude(int basePixel, int mixPixel) {
int res = 0;
res = (mixPixel + basePixel) - mixPixel * basePixel / 128;
return Math.min(255, Math.max(0, res));
}

public static void main(String[] args) throws Exception {

Lomo("C:\\2.jpg", "C:\\test2.jpg");

}

java 滤镜实现的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. Android 照相 滤镜

    android-image-filter 19种相片滤镜,使用也简单,all filters in file BitmapFilter.java : Bitmap newBitmap = Bitmap ...

  3. java 解析并生成 XML

    在 java 中使用 Dom4j 解析 XML 对 XML 文件的解析,通常使用的是 Dom4j 和 jdom 作为XML解析工具. 在此只介绍下 Dom4j 对 XML 文件的解析使用方法. 1. ...

  4. Android 图片滤镜工具——高斯模糊

    ===================高斯模糊========================= 创建一个 ImageFilter 类(滤镜工具),代码如下: import android.graph ...

  5. Atitit Atitit 图像处理之  Oilpaint油画滤镜 水彩画 源码实现

    Atitit Atitit 图像处理之 Oilpaint油画滤镜 水彩画 源码实现 1.1. 具体原理参考1 2. 水彩画滤镜算法如下:1 2.1. 这个其实就是灰度层次降低维度的过程.2 2.2. ...

  6. Atitit 图像处理之仿油画效果 Oilpaint油画滤镜 水彩画 漫画滤镜 v2

    Atitit 图像处理之仿油画效果 Oilpaint油画滤镜 水彩画 漫画滤镜 v2 1.1. 具体源码参考1 2. ,油画 水彩画具有几个比较明显的特点如下:1 2.1. 明暗层次(灰度)较少  也 ...

  7. Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结

    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结 1.1. 素描滤镜的实现方法比较简单,这里我们直接写出算法过程如下:1 1.2. 颜色减淡COLOR_DO ...

  8. Atitit 图像处理 常用8大滤镜效果 Jhlabs 图像处理类库 java常用图像处理类库

    Atitit 图像处理 常用8大滤镜效果 Jhlabs 图像处理类库 java常用图像处理类库1.1. 5种常用的Photoshop滤镜,分别针对照片的曝光.风格色调.黑白照片处理.锐利度.降噪这五大 ...

  9. Android OpenGL 编写简单滤镜

    Android 上使用Opengl进行滤镜渲染效率较高,比起单纯的使用CPU给用户带来的体验会好很多.滤镜的对象是图片,图片是以Bitmap的形式表示,Opengl不能直接处理Bitmap,在Andr ...

随机推荐

  1. 深度学习笔记(四)VGG14

    Very Deep Convolutional Networks for Large-Scale Image Recognition 1. 主要贡献 本文探究了参数总数基本不变的情况下,CNN随着层数 ...

  2. (地址)eclipse插件开发攻略的访问地址

    园子地址: http://www.cnblogs.com/liuzhuo/category/257208.html 关键字: Eclipse插件开发彻底攻略 eclipse插件开发基础篇之

  3. c# ConfigurationSection

    怎么把自己的配置文件配置到app.config中? 方案1:在app.config中添加 <!--应用配置--> <appSettings configSource="Co ...

  4. LATEX论文排版学习资源汇总

    一.国内出版的LaTeX书籍 不管是ctex还是chinatex论坛,很多TeX前辈和使用者都给大家提供了很多咨询帮助,同时,也分享了很多很多学习上的方法与技巧.一般都推荐入门的用户先阅读一本入门书, ...

  5. 前端里神奇的BFC 原理剖析

    以前在做自适应两栏布局的时候别人口中听到bfc这个词,于是看了各种关于bfc的文章,发现梦想天空介绍的不错,今天就在他的基础上润色一下. 一.BFC是什么? 在解释 BFC 是什么之前,需要先介绍 B ...

  6. numpy——linspace创建等差数列

    numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) a=np.linspace(1000,320 ...

  7. The method setCharacterEncoding(String) is undefined for the type HttpServletResponse 是什么原因?

    response.setCharacterEncoding("gb2312"); 在Servlet2.3中是不行的,至少要2.4版本才可以,如果低于2.4版本,可以用如下办法: r ...

  8. python-操作csv文件

    import csv lv,er=[],[] #读 with open('date.csv') as mycsv: reader=csv.DictReader(mycsv) for row in re ...

  9. 初识Python第二天(1)

    在Python中,一切事物都是对象,对象是基于类创建的,对象继承了类的属性,方法等. 一.传递参数 1.1新建python文件,名为twoday_args.py,输出以下代码 import sys p ...

  10. 关于mysql中int(1)中int后面的数字

    mysql在建表的时候int类型后的长度代表什么? 是该列允许存储值的最大宽度吗? 为什么我设置成int(1), 也一样能存10,100,1000呢.  当时我虽然知道int(1),这个长度1并不代表 ...