我想模糊一张照片,然后慢慢让它聚焦。
我想用java来做,有没有开源可以做到这一点?
我发现了一些模糊图片的开源代码,但没有一个相反的。
阅读(或谷歌)卷积过滤器- 它基本上是一种根据周围像素值更改像素值的方法。因此,除了模糊之外,您还可以进行图像锐化、寻线等操作。
Java FX 2 有一些方法可以应用模糊效果 - 例如,请参阅本教程。该示例可以适应模糊图像而不是文本。
您可以模糊您的图像,然后逐渐“取消模糊”它以使其看起来更集中。
我为你写了一个小代码:
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
tho 的引用,但您可以像我一样在变量中创建它。如果您想了解有关代码如何工作的更多信息,或者如果您有任何问题,请问我。这是线性模糊,最常见的模糊是高斯模糊。如果需要,只需将、 和pixels
变量red
设为二维数组。仅此代码的最终结果应如下所示
:green
blue