1. 程式人生 > >Java 影象處理

Java 影象處理

影象放大與縮小

實現圖片的放大與縮小則需要使用drawImage()的過載方法

語法如:drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)

該方法將img圖片顯示在xy指定的位置上,並指定圖片的寬度和高度屬性。

 

 例:在窗體中顯示原始大小的圖片,然後通過兩個按鈕的單擊事件,分別顯示該圖片縮小與放大後的效果(可以藉助 repaint() 方法將呼叫paint()方法實現元件或畫板的重繪功能,類似於介面重新整理

import java.util.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.filechooser.*;
import javax.swing.table.*;
import java.net.*;

public class t3 extends JFrame{
	
	private static final long serialVersionUID = 1L;
	private URL imgUrl = t3.class.getResource("/Hern.jpg");// 獲取圖片資源的路徑
	private Image img = Toolkit.getDefaultToolkit().getImage(imgUrl);// 獲取圖片資源
	private JPanel contentPanel = null;
	private JSlider jSlider = null;
	private int imgWidth, imgHeight;
	private Canvas canvas = null;
	
	public t3() {
		setTitle("Hern"); // 設定窗體標題
		setBounds(100, 100, 1000, 500); // 設定窗體大小和位置
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 設定窗體關閉模式
		canvas = new MyCanvas();
		setContentPane(getContentPanel()); // 設定內容面板
	}
	
	// 內容面板的佈局
	private JPanel getContentPanel() {
		if (contentPanel == null) {
			contentPanel = new JPanel();
			contentPanel.setLayout(new BorderLayout());
			contentPanel.add(getJSlider(), BorderLayout.SOUTH);
			contentPanel.add(canvas);
		}
		return contentPanel;
	}
	
	// 獲取滑塊元件
	private JSlider getJSlider() {
		if (jSlider == null) {
			jSlider = new JSlider();
			jSlider.setMaximum(1000);
			jSlider.setValue(100);
			jSlider.setMinimum(1);
			jSlider.addChangeListener(new ChangeListener() {
				
				public void stateChanged(ChangeEvent e) {
					canvas.repaint();//實現畫板的重畫功能
				}
			});
		}
		return jSlider;
	}
		
	// 畫板類
	class MyCanvas extends Canvas {
			
		private static final long serialVersionUID = 1L;

		public void paint(Graphics g) {
			int newW = 0, newH = 0;
			imgWidth = img.getWidth(this); // 獲取圖片寬度
			imgHeight = img.getHeight(this); // 獲取圖片高度
			float value = jSlider.getValue();// 滑塊元件的取值
			newW = (int) (imgWidth * value / 100);// 計算圖片放大後的寬度
			newH = (int) (imgHeight * value / 100);// 計算圖片放大後的高度
			g.drawImage(img, 0, 0, newW, newH, this);// 繪製指定大小的圖片
		}
	}
		
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		t3 test = new t3();
		test.setVisible(true);
	}

}

 影象翻轉

影象的翻轉需要使用drawImage()方法的另一個過載方法,語法如下所示:

drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)

 此方法總是用非縮放的影象來呈現縮放的矩形,並動態的執行所需要的縮放。

此操作不使用快取的縮放影象。

執行影象 從源到目標的縮放,要將源矩形的第一個座標對映到目標矩形的第一個座標,源矩形的第二個座標對映到目標矩形的第二個座標,按需要縮放和翻轉子影象以保持這些對映關係。

import java.util.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.filechooser.*;
import javax.swing.table.*;
import java.net.*;

public class t3 extends JFrame{
	
	private static final long serialVersionUID = 1L;
	private URL imgUrl = t3.class.getResource("Hern.jpg");// 獲取圖片資源的路徑
	private Image img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 獲取圖片資源
	private int dx1, dy1, dx2, dy2;
	private int sx1, sy1, sx2, sy2;
	private JPanel jPanel = null;
	private JPanel jPanel1 = null;
	private JButton jButton = null;
	private JButton jButton1 = null;
	private MyCanvas canvasPanel = null;
	
	public t3() {
		dx2 = sx2 = 300; // 初始化影象大小
		dy2 = sy2 = 200;
		initialize(); // 呼叫初始化方法
	}
	
	// 介面初始化方法
	private void initialize() {
		this.setBounds(100, 100, 300, 260); // 設定窗體大小和位置
		this.setContentPane(getJPanel());
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 設定窗體關閉模式
		this.setTitle("Hern"); // 設定窗體標題
	}
	
	// 獲取內容面板的方法
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(new BorderLayout());
			jPanel.add(getControlPanel(), BorderLayout.SOUTH);
			jPanel.add(getMyCanvas1(), BorderLayout.CENTER);
		}
		return jPanel;
	}
	
	// 獲取按鈕控制面板的方法
	private JPanel getControlPanel() {
		if (jPanel1 == null) {
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.gridx = 1;
			gridBagConstraints.gridy = 0;
			jPanel1 = new JPanel();
			jPanel1.setLayout(new GridBagLayout());
			jPanel1.add(getJButton(), new GridBagConstraints());
			jPanel1.add(getJButton1(), gridBagConstraints);
		}
		return jPanel1;
	}
	
	
	// 獲取水平翻轉按鈕
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setText("水平翻轉");
			jButton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					sx1 = Math.abs(sx1 - 300);
					sx2 = Math.abs(sx2 - 300);
					canvasPanel.repaint();
				}
			});
		}
		return jButton;
	}
	
	// 獲取垂直翻轉按鈕
	private JButton getJButton1() {
		if (jButton1 == null) {
			jButton1 = new JButton();
			jButton1.setText("垂直翻轉");
			jButton1.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					sy1 = Math.abs(sy1 - 200);
					sy2 = Math.abs(sy2 - 200);
					canvasPanel.repaint();
				}
			});
		}
		return jButton1;
	}
	
	// 獲取畫板面板
	private MyCanvas getMyCanvas1() {
		if (canvasPanel == null) {
			canvasPanel = new MyCanvas();
		}
		return canvasPanel;
	}
	
	//畫板
	class MyCanvas extends JPanel {
	
		private static final long serialVersionUID = 1L;

		public void paint(Graphics g) {
			g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, this);// 繪製指定大小的圖片
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		t3 test = new t3();
		test.setVisible(true);
		
	}

}

 

圖片旋轉

影象的旋轉需要呼叫Graphics2D類的rotate()方法,該方法將根據指定的弧度旋轉影象。

語法:rotate(double theta)

theta:旋轉的弧度

注意:rotate()方法只接受旋轉的弧度作為引數,可以使用Math類的 toRadians() 方法將角度轉換為弧度。toRadians() 方法接受角度值作為引數,返回值是轉換完畢的弧度值。

import java.util.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.filechooser.*;
import javax.swing.table.*;
import java.net.*;

public class t3 extends JFrame{
	
	private static final long serialVersionUID = 1L;
	private URL imgUrl = t3.class.getResource("Hern.jpg");
	private Image img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 獲取圖片資源
	private MyCanvas canvasPanel = null;
	
	public t3() {
		initialize(); // 呼叫初始化方法
	}
	
	// 介面初始化方法
	private void initialize() {
		canvasPanel = new MyCanvas();
		this.setBounds(100, 100, 400, 350); // 設定窗體大小和位置
		add(canvasPanel);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 設定窗體關閉模式
		this.setTitle("Hern"); // 設定窗體標題
	}
	
	// 畫板
	class MyCanvas extends JPanel {
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		public void paint(Graphics g) {
			Graphics2D g2 = (Graphics2D) g;
			g2.rotate(Math.toRadians(5));
			g2.drawImage(img, 70, 10, 300, 200, this);// 繪製指定大小的圖片
			g2.rotate(Math.toRadians(5));
			g2.drawImage(img, 70, 10, 300, 200, this);// 繪製指定大小的圖片
			g2.rotate(Math.toRadians(5));
			g2.drawImage(img, 70, 10, 300, 200, this);// 繪製指定大小的圖片
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		t3 test = new t3();
		test.setVisible(true);
		
	}

}