java怎么将一个图像画到一个指定的圆形区域呢?图一图二上图中图一为原图,现给定素材,需要将图像画城图二然
java怎么将一个图像画到一个指定的圆形区域呢?
图一

图二

上图中图一为原图,现给定素材,需要将图像画城图二然后输出。现在问题是,
给定的图像都是矩形,怎么将矩形的图片画到中间的那两个圆里面呢?
链接: http://download.csdn.net/detail/raistlic/5054386
[解决办法]
代码很简陋,还是贴出来吧,模糊用了第三方库 jhlabs 的高斯模糊
import com.jhlabs.image.GaussianFilter;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/**
*
* @date 05/02/2013
*/
public class Demo extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("Test");
f.setContentPane(new Demo());
f.pack();
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
private BufferedImage image;
private Image small;
private Point loc;
private int halfScaledSize;
Demo() {
try {
image = ImageIO.read(getClass().getResourceAsStream("koala.jpg"));
small = image.getScaledInstance(
image.getWidth()/2, image.getHeight()/2,
Image.SCALE_SMOOTH);
halfScaledSize = small.getWidth(this) / 8;
loc = new Point(0, 0);
}
catch(Exception e) {
throw new RuntimeException(e);
}
setPreferredSize(new Dimension(small.getWidth(this), small.getHeight(this)));
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
loc.x = e.getX();
loc.y = e.getY();
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(small, 0, 0, this);
int x = loc.x - halfScaledSize;
int y = loc.y - halfScaledSize;
int size = halfScaledSize * 2;
BufferedImage shadow = getRoundPanel(Color.BLACK, size+10, 10);
g.drawImage(shadow, x + 5, y + 5, this);
g.drawImage(getRoundPanel(Color.WHITE, size+10, 4), x, y, this);
g.drawImage(getRenderedImage(image, loc.x * 2, loc.y * 2, size, 2),
x + 5, y + 5, this);
}
private BufferedImage getRoundPanel(Color c, int size, int blur) {
int fix = blur / 2;
BufferedImage result = new BufferedImage(
size, size, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = result.createGraphics();
g.setClip(new RoundRectangle2D.Double(
fix, fix, size - blur, size - blur, size - blur, size - blur));
g.setColor(c);
g.fillRect(0, 0, result.getWidth(), result.getHeight());
g.dispose();
GaussianFilter filter = new GaussianFilter(blur);
result = filter.filter(result, result);
return result;
}
private BufferedImage getRenderedImage(
BufferedImage img, int x, int y, int size, int blur) {
int fix = blur / 2;
BufferedImage result = new BufferedImage(
size, size, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = result.createGraphics();
g.setClip(new RoundRectangle2D.Double(
fix, fix, size-blur, size-blur, size-blur, size-blur));
g.translate(-x, -y);
g.drawImage(img, fix, fix, null);
size -= blur * 2;
GaussianFilter filter = new GaussianFilter( blur * 2 );
result = filter.filter(result, result);
g.setClip(new RoundRectangle2D.Double(
blur, blur, size - blur * 2, size - blur * 2, size - blur * 2, size - blur * 2));
g.drawImage(img, fix, fix, null);
g.dispose();
return result;
}
}
[解决办法]