天天看點

java學習筆記13——多媒體技術

Java語言不僅支援圖形和文本媒體,同樣支援圖像、聲音、動畫及視訊等其他多媒體,進而大大拓寬了其應用領域,使基于Java的應用更加豐富多彩,更具魅力。

本章講解Java的多媒體處理方法

一、圖像處理

1  圖像檔案的 裝載 

Java目前隻支援兩種圖像檔案格式GIF和JPEG

Java特别提供了java.awt.Image類來處理圖像

Java采用 URL(Universal Resource Location,統一資源定位器)來 定位圖像檔案的網絡位置 

1).URL類

一個URL資訊可分為兩種形式:一種稱為絕對URL形式,另一種稱為相對URL形式 

基準URL(也即絕對URL形式): http://www.xyz.com/java/imgsample/

  相對URL: images/m1.gif 

  2).getImage( )方法 

getImage( )方法的調用格式有以下兩種 

Image getImage(URL url) 

  Image getImage(URL url, String name)

Applet類中提供了兩個方法來幫助我們友善地擷取基準URL對象,它們的調用格式如下:

 URL getDocumentBase( )  傳回的基準URL對象代表了包含該applet的HTML檔案所處的目錄 

  URL getCodeBase( ) 傳回的基準URL對象代表了該applet檔案(.class檔案)所處的目錄  

  2  圖像檔案的顯示

調用 Graphics類的drawImage( )方法,它能完成将Image對象中的圖像顯示在螢幕的特定位置

1)boolean drawImage(Image img, int x, int y, ImageObserver observer) 

其中img參數就是要顯示的Image對象,x和y參數是該圖像左上角的坐标值,observer參數則是一個ImageObserver接口(interface)

2)boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)  

這種格式比第一種格式多了兩個參數width和height,即表示圖像顯示的寬度和高度 

Image類中的兩個方法就可以分别得到原圖的寬度和高度:

int getWidth(ImageObserver observer)

  int getHeight(ImageObserver observer)

例1 drawImage

import java.awt.Image;
import java.awt.Graphics;

public class drawImage extends java.applet.Applet{//這裡的public便不是可有可無了
	Image img;
	public void init(){
		img=getImage(getCodeBase(),"boy.gif");//getCodeBase()通過獲得本類所在的檔案的路徑來獲得圖檔的絕對URL
	}
	public void paint(Graphics g){
		int width=img.getWidth(this);
		int height=img.getHeight(this);
		g.drawImage(img,20,10,this);//原圖
		g.drawImage(img,200,10,width/2,height/2,this);//縮小一半
		g.drawImage(img,280,10,width*2,height,this);//寬扁圖
		g.drawImage(img,400,10,width,height*2,this);//瘦高圖
	}
}
           

其中,html檔案為drawImage.htm

<html>
<h1>this is an applet of java for Image</h1>
<applet code="drawImage" width=750 height=180></applet>
</html>
           

編譯:javac drawImage.java

運作:appletviewer drawImage.htm

圖檔為boy.gif

java學習筆記13——多媒體技術

運作結果為:

java學習筆記13——多媒體技術

注意:上面示例中,類必須為public,否則,會出現如下異常:

java學習筆記13——多媒體技術

示例2_對圖像剪切:定了三個剪切點,clipExample

import java.awt.*;
import java.awt.geom.*;
import java.applet.*;

public class clipExample extends Applet{
	public void paint(Graphics g){
		Image img=getImage(getCodeBase(),"boy.gif");
		int w=img.getWidth(this);
		int h=img.getHeight(this);
		//int w=getSize().width;
		//int h=getSize().height;//大家可以把這兩句換上面兩句試試
		g.fillRect(0,0,w,h);
		Polygon p=new Polygon();
		p.addPoint(0,0);
		p.addPoint(w/2,h);
		p.addPoint(w,0);
		g.setClip(p);
		g.drawImage(img,0,0,this);
	}
}
           

  二、聲音檔案的播放

  Java目前支援的聲音檔案格式有:AU格式(.AU檔案),也稱為u-law格式,AIFF、WAV以及三種MIDI檔案格式(MIDI檔案類型0、MIDI檔案類型1,以及RMF)

Java提供兩種播放聲音的機制:Applet類的play()方法及AudioClip的play()方法  

1  Applet類的play()方法

格式如下:

void play(URL url)

  void play(URL url, String name) 

  2  AudioClip的play()方法

AudioClip類,它能更有效地管理聲音的播放操作 

因為它被定義在java.applet程式包中,是以需要在程式頭部加上:

 import java.applet.AudioClip;

格式如下:

AudioClip getAudioClip(URL url)

  AudioClip getAudioClip(URL url, String name)

  主要方法 

loop()循環播放

start()開始播放

stop()停止播放

三、用Java實作播放動畫

1   線程的使用

通過多線程實作循環,在螢幕上出現的一系列幀來造成運動的效果,進而達到顯示動畫的目的 

2  動畫程式的設計步驟 

第一步,定義Applet對象的同時定義Runnable接口,這樣就可以繼承線程的run()方法 

第二步,定義Thread對象,即 動畫線程 

第三步,在Applet對象的start()方法中建立一個動畫線程并啟動它,動畫線程自動啟動run()方法

第四步,在Applet對象的stop()方法中,可以終止動畫線程的執行。 

第五步,run()方法包含控制動畫的循環,循環一次就調用一次repaint()方法,繪制一幅圖像

第六步,改寫paint()方法,即此方法中需根據某些變量來進行繪圖。 見例13。3 

例13.2  AnimationImage.java,當然,要在源代碼同下目錄下準備有images[number].gif圖檔

import java.awt.*;
import java.applet.*;

public class AnimationImage extends Applet implements Runnable{
	Image imageFrame[];
	public Thread animationRunner;
	public int frame_i=0;

	public void init()
	{
		int i=0;
		imageFrame=new Image[5];
		for(i=0;i<imageFrame.length;i++){
			imageFrame[i]=getImage(getCodeBase(),"images"+i+".gif");
		}
	}

	public void start(){
		if(animationRunner==null){
			animationRunner=new Thread(this);
			animationRunner.start();
		}
	}

	public void stop(){
		if(animationRunner!=null){
			//animationRunner.stop();//已過時
			animationRunner=null;
		}
	}

	public void run(){
		while(Thread.currentThread()==animationRunner){
			repaint();//No.1 statement
			try{
				Thread.sleep(500);//wait
			}
			catch(InterruptedException e){

			}
			frame_i=(frame_i+1)%imageFrame.length;//in order to repaint
		}//end of while
	}

	public void paint(Graphics g){
		g.drawImage(imageFrame[frame_i],0,0,this);
	}
}
           

下面是:AnimationImage.htm

<html>
<body>
<h1>This is an applet for Animation with images</h1>
<applet code="AnimationImage" width="180" height="80"></applet>
<body>
</html>
           

3  動畫的閃爍 

可用兩種方法來減少閃爍,

一種是重載update()方法,

一種是使用 雙緩沖技術 

四、用JMF來播放視訊

——關于這方面,據網上說是用JMF已過時了,Oracle已停止支援?不過,在這裡将相應資料留下,點選打開連結

參考資料:點選打開連結

———————————————————————————————————http://www.oracle.com/technetwork/cn/java/javase/tech/index-jsp-140239-zhs.html

這種涉及到架構的,架構是另外下的,JMF 下載下傳連結如下————————————————http://www.oracle.com/technetwork/java/javase/download-142937.html

1  什麼是JMF(Java Media Frame,簡稱JMF) 

Java媒體架構是一組用來播放、處理和捕捉媒體資訊的API 

JMF運用RTP實時傳輸協定 

JMF提供了一個三層的體系結構:

第一層為進階表現形式(播放器),作為一個應用程式,使用者可通過播放器來收看視訊;

第二層為過程處理API;軟體開發人員通過進階API進行互動的應用程式的開發;

第三層為低級插入式API。通過一種可以內建到體系結構的插件,為整個體系結構提供一種可擴充的能力  

2  播放視訊

播放媒體就相應地需要一個播放器 ,一個播放器具有六種狀态: 

1)Unrealized:當一個播放器已被建立,并對即将要播放的媒體一無所知時的狀态。

2)Realizing:調用了播放器的realize方法後,可以判定它的資源的請求。

3)Realized:當Realizing過程結束後進入該狀态,此時,已知道需要哪些資源以及将要播放的媒體相關的類型資訊。

4)Prefetching:當播放器的prefetch方法被調用後進入該狀态,準備播放媒體資料。

5)Prefetched:當播放器的Prefetching操作完成後,進入該狀态,此時已準備啟動播放。

6)Started:當start方法調用後進入該狀态,開始播放 

建立一個播放器的主要步驟如下:

① 建立播放器。用javax.media包中的Manager類的createPlayer方法建立一個Player對象。

② 向播放器注冊一個控制器。Player提供一個實作ControllerListener接口的事件處理器,該接口有一個方法controllerUpdate(ControllerEvent event),當媒體事件發生時調用此方法。

③ 播放器進行預提取。調用Player類的prefetch()方法。

④ 啟動播放器。調用Player類的start()方法。

⑤ 停止播放器。調用Player類的stop()方法。

3  JMF進階功能

JMF除了可以播放媒體外,還可以處理媒體和捕捉媒體。

處理工作包括:與信号分離器、多路複用器、數字信号編/解碼器、效果過濾器以及renders相關的工作。處理後的結果可以供使用者播放,也可以傳送給其他目的地。

import java.awt.*;
import java.awt.event.*;
import javax.media.*;

class player extends Frame implements ControllerListener {
	Player p;
	Component vc;

player(String ss,String mediaurl)
	{
	super(ss);
	 try {
		p = Manager.createPlayer(new MediaLocator( mediaurl));
	    } catch (NoPlayerException e) {
		System.out.println("could not find a player.");
		System.exit(-1);
	    }
catch (java.io.IOException e) {
		System.out.println(e);
		System.exit(-1);
	    }
		if(p == null)
		{System.out.println("trouble crating player.");
		System.exit(-1);}
	    p.addControllerListener(this);
		p.prefetch();
	}

public synchronized void controllerUpdate(ControllerEvent event) {
if (event instanceof EndOfMediaEvent) {
	p.setMediaTime(new Time(0));
	p.start();
	return;
}
if (event instanceof PrefetchCompleteEvent) {
p.start();
	return;
}
if (event instanceof RealizeCompleteEvent) {
vc=p.getVisualComponent();
if (vc != null){
	add(vc);}
pack();
setResizable(false);
setVisible(true);

}
}

	 public static void main(String args[]) {
		 if(args.length != 1)
		 {System.out.println("error url");
		 return;}
        player nowFrame=new player("player example1",args[0]);
         nowFrame.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);
         }
  });
	 }
}