我想模糊一张图片,然后慢慢将其聚焦。
我想用java做,有没有这样做的开源?
我找到了一些模糊图片的开放源代码,但没有一个反过来。
答案 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
的引用,但是可以像我一样在变量中创建它。如果您想进一步了解代码的工作原理,或者有任何疑问,请问我。
这是线性模糊,最常见的模糊是高斯模糊。如果需要,只需将pixels
,red
,green
和blue
变成二维数组即可。
仅此代码的最终结果应如下所示:
image