设置剪裁区域 Clip
package my;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class MyPanel extends JPanel
{
BufferedImage image;
public MyPanel()
{
//加载图片
URL imagePath=getClass().getResource("/images/pobing_05.jpeg");
try {
image=ImageIO.read(imagePath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g)
{
int width=this.getWidth();
int height=this.getHeight();
Graphics2D g2d=(Graphics2D)g;
//计算缩放后的区域
int imgW=image.getWidth();
int imgH=image.getHeight();
JsImageScaler scaler=new JsImageScaler(imgW,imgH,width,height);
Rectangle fit=scaler.fitCenterInside();
//设置clip区域(仅区域内可以绘制)
int size=250;
Shape region=new Ellipse2D.Double((width-size)/2,(height-size)/2,size,size);
g2d.clip(region);
g2d.drawImage(image, fit.x, fit.y, fit.width, fit.height, null);
}
}
package my;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyFrame extends JFrame
{
public MyFrame(String title)
{
super(title);
//ContentPane
JPanel root=new MyPanel();
this.setContentPane(root);
root.setLayout(new BorderLayout());
}
}
package my;
import java.awt.Rectangle;
public class JsImageScaler {
// 输入参数
private int imgW,imgH; // 图片的宽度、高度
private Rectangle rect; // 要绘制的目标区域
// imgW, imgH, 图片的宽度/高度
// rect: 目标区域
public JsImageScaler(int imgW, int imgH, Rectangle rect)
{
this.imgW = imgW;
this.imgH = imgH;
this.rect = rect;
}
public JsImageScaler(int imgW, int imgH, int dstW, int dstH)
{
this(imgW, imgH, new Rectangle(dstW, dstH));
}
// 拉伸显示,占满空间(比例可能失调)
public Rectangle fitXY()
{
return this.rect;
}
// 居中显示,保持长宽比,且适合目标矩形
public Rectangle fitCenter()
{
int width = rect.width;
int height = rect.height;
int fitW = width;
int fitH = imgH*width/imgW;
if( fitH > height )
{
fitH = height;
fitW = height * imgW / imgH;
}
int x = (width - fitW ) /2;
int y = (height - fitH ) /2;
// 结果
return new Rectangle(rect.x + x, rect.y + y, fitW, fitH);
}
// 如果图片小于目标矩形,则直接居中显示
// 如果图片大于目标矩形,则按fitCenter()缩放后显示
public Rectangle fitCenterInside()
{
int width = rect.width;
int height = rect.height;
int fitW, fitH;
if(imgW <= width && imgH <= height)
{
fitW = imgW;
fitH = imgH;
int x = (width - fitW ) /2;
int y = (height - fitH ) /2;
return new Rectangle(rect.x + x, rect.y + y, fitW, fitH);
}
else
{
return fitCenter();
}
}
}
package my;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class MyDemo
{
private static void createGUI()
{
// JFrame指一个窗口,构造方法的参数为窗口标题
JFrame frame = new MyFrame("Swing Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗口的其他参数,如窗口大小
frame.setSize(500, 300);
// 显示窗口
frame.setVisible(true);
}
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run()
{
createGUI();
}
});
}
}