缩放图片是一款图像处理软件必备的功能 , 哪么如何在Java中得以实现呢?
也许有些高手可能知道使用像素点缩放来实现 , 可惜这种方式比较麻烦些 , 下面我介绍一种更加简单的方式 :
前段时间研究java的绘图机制的时候 , 了解到Graphics中drawImage()方法是可以实现相应的图片缩放 ,
下面我们看看api的详述:(红色字体)
public abstract boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
-
绘制指定图像中已缩放到适合指定矩形内部的图像。
图像绘制在此图形上下文坐标空间的指定矩形内部,如果需要,则进行缩放
img
- 要绘制的指定图像。如果 img
为 null,则此方法不执行任何操作。
x
- x 坐标。
y
- y 坐标。
width
- 矩形的宽度。
height
- 矩形的高度。
observer
- 转换了更多图像时要通知的对象。
那么也就是说 : 对参数width和height做相应的修改就能简单的实现图片的缩放功能
下面进入代码阶段:
- import java.awt.Toolkit;
- import java.awt.Dimension;
- import java.awt.Graphics;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- import javax.swing.ImageIcon;
- import java.awt.event.MouseWheelEvent;
- import java.awt.event.MouseWheelListener;
- public class ZoomImage extends JFrame{
- private ZoomPanel zp;
- public ZoomImage() {
- //获取屏幕大小
- Dimension frameSize = Toolkit.getDefaultToolkit().getScreenSize();
- frameSize.width = frameSize.width / 2;
- frameSize.height = frameSize.height * 3 / 4;
- setSize(frameSize);
- setLocationRelativeTo(null);//居中显示
- zp = new ZoomPanel(frameSize, "1.jpg");
- getContentPane().add(zp);
- //添加鼠标滚轮消息响应
- addMouseWheelListener(new MouseWheelListener(){
- public void mouseWheelMoved(MouseWheelEvent e){
- //滚轮向前滑动 放大
- if(e.getWheelRotation() < 0){
- zp.enlargeImg();
- }
- //滚轮向后滑动 缩小
- else{
- zp.reduceImg();
- }
- }
- });
- setUndecorated(true);//去掉修饰框 这样的显示效果更佳
- setDefaultCloseOperation(3);
- setResizable(false);
- setVisible(true);
- }
- public static void main(String[] args) {
- new ZoomImage();
- }
- }
- //缩放面板
- class ZoomPanel extends JPanel {
- private ImageIcon ii;
- private Dimension frameSize;
- private int x, y, width, height;//图片的坐标、缩放的size
- public ZoomPanel(Dimension fs, String imgPath) {
- setBackground(Color.WHITE);
- this.frameSize = fs;
- ii = new ImageIcon(imgPath);
- width = ii.getIconWidth();
- height = ii.getIconHeight();
- setImgPos();
- }
- //设定x、y坐标
- public void setImgPos() {
- x = (frameSize.width - width) / 2;
- y = (frameSize.height - height) / 2;
- }
- //放大
- public void enlargeImg(){
- if(width >= ii.getIconWidth() * 2){
- return;
- }
- if(height >= ii.getIconHeight() * 2){
- return;
- }
- width += width / 9; //这里为什么是除以9呢 这个是数学问题 留给大家自己想吧 要是不明白,可以留言
- height += height / 9;
- setImgPos();
- repaint();
- }
- //缩小
- public void reduceImg(){
- if(width <= ii.getIconWidth() / 5){
- return;
- }
- if(height <= ii.getIconHeight() / 5){
- return;
- }
- width -= width / 10;
- height -= height / 10;
- setImgPos();
- repaint();
- }
- //重绘
- public void paintComponent(Graphics g) {
- super.paintComponent(g);
- g.drawImage(ii.getImage(), x, y, width, height, null);
- }
- }
运行效果 :