使用Java模糊图像?

时间:2012-10-30 14:53:32

标签: java image

我想模糊一张图片,然后慢慢将其聚焦。

我想用java做,有没有这样做的开源?

我找到了一些模糊图片的开放源代码,但没有一个反过来。

3 个答案:

答案 0 :(得分:3)

阅读(或Google)卷积滤镜 - 它基本上是一种根据周围像素值更改像素值的方法。因此,除了模糊之外,您还可以执行图像锐化,寻线等操作。

答案 1 :(得分:0)

Java FX 2有一些应用模糊效果的方法 - 例如参见this tutorial。该示例可以适用于模糊图像而不是文本。

你可以模糊你的图像然后逐渐“解开”它以使它看起来更集中。

答案 2 :(得分:0)

我为您编写了一些代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Blur 
{
    
    static BufferedImage img;
    
    public static void main(String a[]) throws IOException
    {
        img = ImageIO.read(new File("res/image.png"));
        
        JFrame f = new JFrame("blur");
        
        f.setSize(img.getWidth() * 2, img.getHeight());
        f.setResizable(false);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setIconImage(img);
        
        JPanel panel = new JPanel() {
            protected void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                g.drawImage(img, 0, 0, null);
                g.drawImage(blur(10, 69), img.getWidth(), 0, null);
            }
        };
        f.add(panel);
        f.setVisible(true);
        
    }
    
    private static int clamp(int var, int min, int max)
    {
        if(var <= min) return min;
        else if(var >= max) return max;
        else return var;
    }
    
    public static BufferedImage blur(int range, int angle)
    {
        BufferedImage b = new BufferedImage(img.getWidth() * 2, img.getHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics2D g = b.createGraphics();
        
        for(int x = 0; x < img.getWidth(); x++)
        {
            for(int y = 0; y < img.getHeight(); y++)
            {
                
                //horizontal
                
                int red[] = new int[range * 2], green[] = new int[range * 2], blue[] = new int[range * 2];
                int pixels[] = new int[range * 2];
                
                for(int i = 0; i < pixels.length; i++)
                {
                    pixels[i] = img.getRGB(clamp(x - clamp(range / 2, 0, range) + i, 0, img.getWidth() - 1), clamp(y - clamp(range / 2, 0, range) + (int)(i * Math.toRadians(angle)), 0, img.getHeight() - 1));
                    
                    red[i] = (pixels[i] >> 16) & 0xff;
                    green[i] = (pixels[i] >> 8) & 0xff;
                    blue[i] = (pixels[i]) & 0xff;
                }
                
                int red_t = 0, green_t = 0, blue_t = 0;
                
                for(int i = 0; i < pixels.length; i++)
                {
                    red_t += red[i];
                    green_t += green[i];
                    blue_t += blue[i];
                }
                
                int r = red_t / (range * 2);
                int gr = green_t / (range * 2);
                int bl = blue_t / (range * 2);
                
                //System.out.println(r + ", " + gr + ", " + bl);
                
                g.setColor(new Color(r, gr, bl));
                g.fillRect(x, y, 1, 1);
                
            }
        }
        g.dispose();
        
        return b;
    }

}

您可能已经猜到了,最重要的部分是public static BufferedImage blur(int range, int angle)方法。 大部分代码仅用于在JFrame中显示图像,但是如果您仅复制该方法,它也将正常工作。您需要对img的引用,但是可以像我一样在变量中创建它。如果您想进一步了解代码的工作原理,或者有任何疑问,请问我。 这是线性模糊,最常见的模糊是高斯模糊。如果需要,只需将pixelsredgreenblue变成二维数组即可。 仅此代码的最终结果应如下所示: image