zoukankan      html  css  js  c++  java
  • java 滤镜实现

    一句话,滤镜的实现就是对像素点(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");

    }

  • 相关阅读:
    C#通过“委托和事件”的方式实现进程监控并与“普通方式”对比
    SharePoint自动化系列——通过PowerShell创建SharePoint Web
    SharePoint自动化系列——通过PowerShell创建SharePoint Site Collection
    IE11不支持Selenium 2.0的解决方法
    C#中WebBrowser控件的使用
    SharePoint自动化系列——Solution auto-redeploy using Selenium(C#)
    多进程监控自动关机工具升级远程关闭多台server——C# works with PowerShell
    通过Windows PowerShell远程管理计算机(精简版)
    .NET项目web自动化测试实战——Selenium 2.0
    HP LoadRunner 12.02 Tutorial T7177-88037教程独家中文版
  • 原文地址:https://www.cnblogs.com/marszhw/p/5908901.html
Copyright © 2011-2022 走看看