0

我想模糊一张照片,然后慢慢让它聚焦。

我想用java来做,有没有开源可以做到这一点?

我发现了一些模糊图片的开源代码,但没有一个相反的。

4

3 回答 3

3

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

于 2012-10-30T14:55:41.007 回答
0

Java FX 2 有一些方法可以应用模糊效果 - 例如,请参阅本教程。该示例可以适应模糊图像而不是文本。

您可以模糊您的图像,然后逐渐“取消模糊”它以使其看起来更集中。

于 2012-10-30T14:57:05.080 回答
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 中显示图像,但如果您只是复制该方法,它也应该可以工作。您需要对imgtho 的引用,但您可以像我一样在变量中创建它。如果您想了解有关代码如何工作的更多信息,或者如果您有任何问题,请问我。这是线性模糊,最常见的模糊是高斯模糊。如果需要,只需将、 和pixels变量red设为二维数组。仅此代码的最终结果应如下所示 greenblue

于 2020-07-24T19:44:21.457 回答