Download presentation
Presentation is loading. Please wait.
1
第11章 Java多媒体技术
2
11.1 图像 Java支持的图像文件格式有GIF和JPEG格式等。下面分别简单介绍在Java Applet和应用程序显示图形图像的方法和步骤。
3
1.在Applet中显示图像 (1)图像的装载 要显示图像先要进行图像的装载。在Applet类中提供了getImage()方法来将指定路径的图像文件装载到Applet中。由于Java语言是面向网络的,因此文件的存储位置不局限于本地机器的磁盘。大部分情况是存取网络中Web服务器上的图像文件。getImage()方法的声明如下: public Image getImage(URL url)获得绝对url地址指定的image对象。 public Image getImage(URL url,String name) 获得绝对url地址指定的image对象,name指明相对于url的image图像文件名。
4
(2)图像的显示 在获得Image对象后,可用Graphics类的drawImage()方法显示图像。drawImage()方法有6种不同的重载形式,常用的声明形式为: public abstract boolean drawImage(Image img,int x,int y,ImageObserver observer)在点坐标(x,y)处(图像位于该点的右下方)将图像文件img按原样大小显示出来。 public abstract boolean drawImage(Image img,int x,int y,int width,int height, ImageObserver observer)在坐标(x,y)处将图像文件img按width和height指定的大小显示出来,这种格式能够放大或缩小图像。
5
drawImage()方法在显示完图像的信息后就会返回。
若需要使用裁剪效果,也可以使用Graphics类的setClip()方法或clipRect()方法。这些方法的声明如下: public abstract void setClip(int x,int y,int width,int height) public abstract void clipRect(int x,int y,int width,int height) 它们的功能均为以坐标(x,y)为左上角,大小为width和height的矩形设置裁剪区域。
6
程序运行时,需要在Applet程序所在目录的下一级目录images中存储有dog.gif文件。
import java.applet.Applet; import java.awt.*; public class ImageDemo extends Applet { private Image im; public void init() { im = getImage(getCodeBase(),"images/dog.gif"); } public void paint(Graphics g) { g.drawImage(im, 0, 0, this); 程序运行时,需要在Applet程序所在目录的下一级目录images中存储有dog.gif文件。
7
例11.1程序运行结果如下图所示。
8
2.在应用程序中显示图像 在应用程序中,装载图像需要使用Toolkit类来实现。一般通过Toolkit类的getDefaultToolkit()方法或通过调用Component类的getToolkit()方法来获得一个Toolkit对象。这两个方法的声明如下: public static Toolkit getDefaultToolkit() // Toolkit类的方法 public Toolkit getToolkit() // Component类的方法
9
【例11.2】在应用程序中装载并显示图像。 import java.awt.*; import javax.swing.*;
class ImageDemo1 extends JPanel { private Image im; public ImageDemo1() { String imageF = System.getProperty("user.dir") + "/sunflowr.jpg"; im = getToolkit().getImage(imageF); setBackground(Color.white); } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(im, 0, 0, this);
10
public static void main(String[] args) {
JPanel panel = new ImageDemo1(); JFrame frame = new JFrame("向日葵"); frame.setBackground(Color.white); panel.setBackground(Color.white); frame.setSize(200, 150); frame.setContentPane(panel); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }
11
例11.2程序运行结果如下图所示。
12
若在程序中显示图像前增加设置裁剪区域的语句,即:
g.clipRect(0,10, 200, 160); // 增加这个语句 g.drawImage(im, 0, 0, this); 则程序的运行结果如下图所示。
13
11.2 动画 动画技术的原理是多幅图画每隔一定时间间隔连续进行显示。
【例11.3】一个简单的文字滚动的 Applet。这个Applet创建一个滚动信息的线程,信息从Applet的显示区域自右至左滚动显示。 import java.applet.Applet; import java.awt.*; public class SimpleBanner extends Applet implements Runnable { String msg = " A Simple Moving Banner.";
14
Thread t = null; int state; boolean stopFlag; public void init() { // 设置颜色 setBackground(Color.cyan); setForeground(Color.red); setFont(new Font("",Font.BOLD,24)); } public void start() { // 启动线程 t = new Thread(this); stopFlag = false; t.start();
15
msg = msg.substring(1, msg.length()); msg += ch; if(stopFlag)break;
public void run() { // 跑动banner线程的进入点 char ch; for( ; ; ) { // 显示banner try { repaint(); Thread.sleep(500); ch = msg.charAt(0); msg = msg.substring(1, msg.length()); msg += ch; if(stopFlag)break; } catch(InterruptedException e) {} }
16
程序的运行结果如下图所示。 public void stop() { // 暂停banner stopFlag = true;
t = null; } public void paint(Graphics g){ //显示banner g.drawString(msg, 50, 30); 程序的运行结果如下图所示。
17
【例11.6】这里再给出一个包含动画线程的Java小程序。动画图片文件存储在源文件所在文件夹的子文件夹images/duke下,文件名为T0.jpg至T14.jpg。
import java.awt.*; import java.awt.image.ImageProducer; import java.applet.Applet; public class ThreadsAnimator extends Applet implements Runnable{ Image images[]; MediaTracker tracker; int index = 0; Thread animator; int maxWidth,maxHeight;
18
Image offScrImage; Graphics offScrGC; boolean loaded = false; // 初始化Applet public void init(){ tracker = new MediaTracker(this); maxWidth = 100; maxHeight = 100; images = new Image[15]; try{ offScrImage = createImage(maxWidth,maxHeight); // 生成后台缓冲区 offScrGC = offScrImage.getGraphics(); offScrGC.setColor(Color.lightGray); offScrGC.fillRect(0,0,maxWidth,maxHeight); resize(maxWidth,maxHeight);
19
}catch(Exception e){ e.printStackTrace(); } for(int i = 0;i < 15;i++) { String imageFile = new String("images/Duke/T" + i +".gif"); images[i]=getImage(getDocumentBase(),imageFile): tracker.addImage(images[i],i); try{ tracker.waitForAll(); }catch(InterruptedException e){ } loaded = true;
20
public void paint(Graphics g){
if(loaded) { g.drawImage(offScrImage,0,0,this); } public void start(){ if(tracker.checkID (index)){ offScrGC.drawImage(images[index],0,0,this); animator = new Thread(this); animator.start(); public void run(){ Thread me = Thread.currentThread();
21
while((animator != null)&&(animator == me)){
if(tracker.checkID(index)){ offScrGC.fillRect(0,0,100,100); offScrGC.drawImage(images[index],0,0,this); index++; if(index>=images.length){ index = 0; } try{ animator.sleep(200); }catch(InterruptedException e){ } repaint();
22
本程序使用了双缓冲区技术来消除动画显示的闪烁。程序运行的显示屏幕如下图所示。
23
11.3 声音 Java支持应用程序和 Applet 中的音频。 它支持下列音频文件格式:WAV 、AIFF和AU(Sun公司支持)。由于AU格式的声音仅有8KHz的采样频率且不支持立体声效果,所以音质不太好。但AU声音文件的尺寸较小,有利于网上传播。 此外,它还支持下列基于 MIDI(Musical Instrument Digital Interface,乐器数字接口)的歌曲文件格式:MIDI TYPE 0、MIDI TYPE 1 和 RMF(Rich Music Format)。
24
Java语言在Applet类中提供的方法play()可以将指定声音文件的装载和播放一并完成,play()方法的声明如下:
public void play(URL url)播放指定绝对地址URL处的声音文件。 public void play(URL url,String name)播放给定URL相对地址和文件名name的声音文件。 其中url参数也经常使用getCodeBase()或getDocument()方法。例如: play(getCodeBase(),"audio.au"); 将加载和播放Applet文件所在目录的声音文件"audio.au"。方法getCodeBase()获取的工作目录正是play()方法需要的。
25
在AudioClip接口中声明了三个需实现的方法:
play()方法只能将声音播放一遍,若想将某声音作为背景声音循环播放,需要用到功能更强的java.applet包中的AudioClip接口,它能更有效地管理声音的播放操作。 (2)AudioClip中的播放声音方法 在AudioClip接口中声明了三个需实现的方法: public void play()开始播放声音文件,每次调用这个方法,都从头开始播放声音文件。 public void loop()在一个循环中开始播放声音文件。 public void stop()停止播放这个声音文件。若未用该方法停止声音的播放,即使离开这一Web页面,声音也不会停止。
26
【例11.7】在Applet中播放指定URL处的au、wav和mid声音文件。
import java.awt.*; import java.awt.event.*; import java.net.*; import java.applet.*; public class SoundDemo extends Applet{ AudioClip aau; public void init(){ aau = getAudioClip(getDocumentBase(), "spacemusic.au"); this.addMouseListener(new MouseAdpt(this)); }
27
public void paint(Graphics g){
g.drawString(“鼠标进入显示区播放 spacemusic.au",20,60); g.drawString(“在显示区鼠标按键播放 tada.wav",20,80); g.drawString(“鼠标移出显示区播放 trippygaia1.mid",20,100); } class MouseAdpt extends MouseAdapter{ Applet ap; MouseAdpt(Applet p){ ap = p;
28
public void mouseEntered(MouseEvent e){
((SoundDemo)ap).aau.play(); } public void mousePressed(MouseEvent e){ ap.play(ap.getDocumentBase(),"tada.wav"); public void mouseExited(MouseEvent e){ ap.play(ap.getDocumentBase(), "trippygaia1.mid");
29
程序的运行界面如下图所示。
30
随着Java 2的引入,应用程序也能用Applet类的newAudioClip()方法装入声音文件并播放声音。该方法的声明如下:
2.在应用程序中播放声音 随着Java 2的引入,应用程序也能用Applet类的newAudioClip()方法装入声音文件并播放声音。该方法的声明如下: public static final AudioClip newAudioClip(URL url) 可用该方法的调用返回值来创建一AudioClip对象。例如: AudioClip au = Applet .newAudioClip( "tada.wav " ); 在创建 AudioClip对象au后,可以对该对象调用接口AudioClip中的play()、loop()以及stop()方法来控制声音文件的播放。若getAudioClip()或 newAudioClip()方法不能找到指定的声音文件, AudioClip对象的值将为空。播放空对象会导致出错,所以标准的过程首先是对该条件进行检测。
31
【例11.8】在应用程序中播放声音。 import java.net.*; import java.applet.*;
import javax.swing.*; import java.awt.*; public class SoundDemo1 extends JPanel{ Applet ap; URL cb; AudioClip aau; JLabel l1 = new JLabel"<html><h3>您欣赏的是\"梁祝.mid\"音乐!" ); SoundDemo1(){ setBackground(Color.white); add(l1);
32
try { cb = new URL("file:"+System.getProperty "user.dir")+"/梁祝.mid" ); aau = Applet.newAudioClip(cb); aau.play(); }catch (MalformedURLException e){ System.err.println(e.getMessage()); } public static void main(String args[]){ JFrame f = new JFrame("在应用程序中播放声音");
33
f.getContentPane().add(new SoundDemo1());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(300,100); f.show(); } 本程序运行时有一界面,在界面上只有一个标签,程序运行后可听到程序指定播放的声音文件“梁祝.mid”的音乐(声音文件存储在源程序文件所在文件夹中),音乐播放或完毕程序将停止音乐的播放。程序未对声音的播放进行控制。
Similar presentations