Swing-高级绘制(设置剪切区域)

设置剪裁区域 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();
			}
		});
 
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值