Java 影象處理
阿新 • • 發佈:2019-01-29
影象放大與縮小
實現圖片的放大與縮小則需要使用drawImage()的過載方法。
語法如:drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
該方法將img圖片顯示在x、y指定的位置上,並指定圖片的寬度和高度屬性。
例:在窗體中顯示原始大小的圖片,然後通過兩個按鈕的單擊事件,分別顯示該圖片縮小與放大後的效果(可以藉助 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);
}
}