Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come...

39
Introduction • Multimedia Use of sound, image, graphics and video Makes applications “come alive”

Transcript of Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come...

Page 1: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

Introduction

• Multimedia– Use of sound, image, graphics and video

– Makes applications “come alive”

Page 2: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

Introduction (cont.)

• We will focus on– Image-manipulation basics

– Creating smooth animations

– Customizing animation applets

– Creating image maps

– Playing audio files (via AudioClip interface)

Page 3: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

Loading, Displaying and Scaling Images

• Demonstrate some Java multimedia capabilities– java.awt.Image

• abstract class (cannot be instantiated)

• Can represent several image file formats

– e.g., GIF, JPEG and PNG

– javax.swing.ImageIcon• Concrete class

• An implementation of the Icon interface that paints Icons from Images.

Page 4: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

LoadImageAndScale.java

Lines 14 and 20

Lines 15 and 21

Line 28

Lines 32-33

1 // LoadImageAndScale.java2 // Load an image and display it in its original size3 // and scale it to twice its original width and height.4 // Load and display the same image as an ImageIcon.5 6 // Java core packages7 import java.applet.Applet;8 import java.awt.*;9 10 // Java extension packages11 import javax.swing.*;12 13 public class LoadImageAndScale extends JApplet {14 private Image logo1; 15 private ImageIcon logo2; 16 17 // load image when applet is loaded18 public void init()19 {20 logo1 = getImage( getDocumentBase(), "logo.gif" );21 logo2 = new ImageIcon( "logo.gif" );22 }23 24 // display image25 public void paint( Graphics g )26 {27 // draw original image28 g.drawImage( logo1, 0, 0, this );29 30 // draw image scaled to fit width of applet31 // and height of applet minus 120 pixels32 g.drawImage( logo1, 0, 120,33 getWidth(), getHeight() - 120, this );34

Objects of class Image must be created via method getImage

Objects of class ImageIcon may be

created via ImageIcon constructor

Method drawImage displays Image object on screen

Overloaded method drawImage displays scaled Image object on screen

Page 5: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

LoadImageAndScale.java (Part 2)

Line 36

Program Output

35 // draw icon using its paintIcon method36 logo2.paintIcon( this, g, 180, 0 );37 }38 39 } // end class LoadImageAndScale

Method paintIcon displays ImageIcon object on screen

Size of the applet: 340 x 340

Page 6: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

Java keyword - this

• this is a reference to the current object — the object whose method or constructor is being called.– pass a reference to the current object as a method parameter

g.drawImage( logo1, 0, 0, this );

– distinguish among the parameters

private int x;

public void setX(int x){

this.x=x;

}

Page 7: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

Animation

• Animation shows different objects moving or changing as time progresses

• Often achieved by launching one or more threads that compute how parts of the animation change

• Can use Swing Timer class for simple animations

• More advanced animations are best implemented with thread

Page 8: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

Timer for animation

• Java’s Timer class (from javax.swing package) generates a sequence of action events, spaced at equal intervals

• Timer constructor requires two arguments:– delay time (in milliseconds)

– action listener to handle the event triggered by the Timer

• Useful for animation

Page 9: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

Animation

• Animation involves painting and repainting the same scene, giving the viewer the illusion of a moving picture

• Two repeated actions can accomplish this– draw a shape

– move the shape

Example: A random moving ball

Page 10: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import javax.swing.Timer;

public class MovingImage extends JFrame { private Container container; private Timer timer; // changes picture once per second private Random rand; // provides random image locations private ImageIcon imageBall; // the “moving” image public MovingImage() { super("Moving imageIcon"); container = this.getContentPane(); rand = new Random(); imageBall = new ImageIcon("ball.jpg"); timer = new Timer(1000, new ActionListener () { public void actionPerformed(ActionEvent event) { repaint(); } }); timer.start(); }

Page 11: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

public void paint (Graphics g) { g.setColor(Color.WHITE);g.fillRect(0,0,200,200);imageBall.paintIcon(container, g, rand.nextInt(150),

rand.nextInt(150)); }

public static void main(String [] args) { JFrame movingimage = new MovingImage(); movingimage.setSize(200,200); movingimage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); movingimage.setVisible(true); }}

Page 12: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

12

Review of Thread

• Extend the Thread class:– public class MyThread extends Thread {…}– Override public void run( )– To make it start:

• MyThread T = new MyThread () ; // create thread• T.start();

• Implement the Runnable interface:– public class MyRunnable implements Runnable {…}– Must implement public void run( )– To make it start:

• MyRunnable r = new MyRunnable() Thread T = new Thread(r); // create thread T.start();

– More flexible

• For Applet?

Page 13: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

import java.applet.Applet;import java.awt.Graphics;public class Anim1a extends Applet implements Runnable {

int position = 0;int increment = 3;Thread t;public void start() {

if (t == null) {t = new Thread(this);t.start();

}}public void stop() {

if (t != null) {t.stop();t = null;

}}public void paint(Graphics g) {

g.fillOval(5, 5 + position, 30, 30);}

Page 14: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

public void run() {while (true) { try {

Thread.sleep(50); } catch (InterruptedException e) {} position += increment; if (position > 50 || position < 0)

increment = -increment; repaint();}

}}

Page 15: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

The version without deprecated stop() method

import java.applet.Applet;import java.awt.Graphics;

public class Anim1n extends Applet implements Runnable { int position = 0; int increment = 3; Thread t;

public void start() { if (t == null) { t = new Thread(this); t.start(); } } public void stop() { t = null; } public void paint(Graphics g) { g.fillOval(5, 5 + position, 30, 30); }

if (t != null) {t.stop();t = null;

}

Page 16: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

public void run() { Thread thisThread = Thread.currentThread();

while (t == thisThread) { try {

Thread.sleep(50); } catch (InterruptedException e) {} position += increment; if (position > 50 || position < 0)

increment = -increment; repaint();}

}}

Page 17: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

Stopping a Thread

• Stop animation loop with a flag• t == null; //will cleanup thread object

Boolean runCondition;

while (runCondition) {

// run animation

}

Page 18: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

class Animation extends Thread {private Anim1c appl;private int increment = 3;Animation(Anim1c a) {

appl = a;}public void run() {

Thread thisThread = Thread.currentThread();while (this == thisThread) { try {

Thread.sleep(50); } catch (InterruptedException e) {} appl.setpos(increment); if (appl.getpos() > 50 || appl.getpos() < 0)

increment = -increment; appl.repaint();}

}}

Page 19: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

public class Anim1c extends Applet {private int position = 0;private Thread t;public void start() {

if (t == null) {t = new Animation(this);t.start();

}}

public int getpos() { return position; } public void setpos(int a) { position += a; } public void stop() {

if (t != null) {t.stop();t = null;

}}public void paint(Graphics g) {

g.fillOval(5, 5 + position, 30, 30);}

}

Page 20: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

Multi-threading

• Multiple parts of the animation– Each part is controlled by a thread

Page 21: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

import java.applet.Applet;import java.awt.Graphics;class Animation extends Thread {

private Applet appl;protected int increment = 3;protected int position = 0;protected int pause = 50;Animation(Applet a) {

appl = a;}public void run() {

Thread thisThread = Thread.currentThread();while (this == thisThread) {

try {Thread.sleep(pause);

} catch (InterruptedException e) {}position += increment;if (position > 50 || position < 0)

increment = -increment;appl.repaint();

}}public void draw(Graphics g) {

g.fillOval(5, 5 + position, 30, 30);}

}

Page 22: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

class Animation1 extends Animation {Animation1(Applet a) {

super(a);increment = 2;pause = 60;

}public void draw(Graphics g) {

g.fillRect(40 + position, 25, 30, 30);}

}

Page 23: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

import java.applet.Applet;import java.awt.Graphics;

public class Anim2a extends Applet {private Animation t, t1;public void start() {

if (t == null) {t = new Animation(this);t.start();

}if (t1 == null) {

t1 = new Animation1(this);t1.start();

}}public void stop() {

if (t != null) {t = null;

}if (t1 != null) {

t1 = null;}

}public void paint(Graphics g) {

t.draw(g); t1.draw(g);

}}

Page 24: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

Double buffering

•Prevents flashing when multiple parts are being drawn to the screen•Receives all of the updates (from multiple parts) to a window during an update

Page 25: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

import java.applet.Applet;import java.awt.*;class Animation extends Thread { private Applet appl; private Color color; private int increment; private int which; private int position = 0; private int pause; Animation(Applet a, Color c, int which, int p, int in) { color = c; appl = a; pause = p; increment = in; this.which = which; } public void run() { Thread thisThread = Thread.currentThread(); while (this == thisThread) { try { Thread.sleep(pause); } catch (InterruptedException e) {} position += increment; if (position > 100 || position < 0)

increment = -increment; appl.repaint();}

}

Double buffering

to avoid flickering

Page 26: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

public void draw(Graphics g) {g.setColor(color);

if (which == 1) g.fillOval(5, 5 + position, 30, 30); else g.fillRect(40 + position, 25, 30, 30); }}

Double Buffering

Page 27: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

public class Anim2b extends Applet { private Animation t, t1; private Image img; // image buffer private Graphics gcopy; // graphics tool for the image buffer public void init() { img = createImage(getWidth(), getHeight()); gcopy = img.getGraphics(); } public void start() { if (t == null) {

t = new Animation(this, Color.red, 1, 50, 3);t.start();

} if (t1 == null) {

t1 = new Animation(this, Color.blue, 2, 60, 2);t1.start();

} }

Double Buffering

Page 28: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

public void stop() { if (t != null) {

t.stop();t = null;

} if (t1 != null) {

t1.stop();t1 = null;

} } // change update so that it calls paint without clearing surface // the default implementation of update() clears the background public void update(Graphics g) { paint(g); } public void paint(Graphics g) { gcopy.setColor(Color.white); gcopy.fillRect(0, 0, size().width, size().height); // prepare the image buffer t.draw(gcopy); // draw 1st object on the image offscreen buffer t1.draw(gcopy); // draw the 2nd object g.drawImage(img, 0, 0, this); // copy the offscreen buffer to // the applet display }}

Double Buffering

Page 29: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

Image Maps

• Image map– Specify regions of an image and assign a specific action to

each region

– Provide an easy way of linking various parts of an image without dividing the image into separate image files

Example: Message appears when user moves cursor over various parts of the image

Page 30: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

ImageMap.java

Lines 23-35

1 // ImageMap.java2 // Demonstrating an image map.3 4 // Java core packages5 import java.awt.*;6 import java.awt.event.*;7 8 // Java extension packages9 import javax.swing.*;10 11 public class ImageMap extends JApplet {12 private ImageIcon mapImage;13 14 private String captions[] = { "Common Programming Error",15 "Good Programming Practice", 16 "Graphical User Interface Tip", "Performance Tip", 17 "Portability Tip", "Software Engineering Observation",18 "Testing and Debugging Tip" };19 20 // set up mouse listeners21 public void init()22 {23 addMouseListener(24 25 new MouseAdapter() {26 27 // indicate when mouse pointer exits applet area28 public void mouseExited( MouseEvent event )29 {30 showStatus( "Pointer outside applet" );31 }32 33 } // end anonymous inner class34 35 ); // end addMouseListener method call

Add MouseMotionListener for when mouse cursor exits applet

area

Page 31: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

ImageMap.java (Part 2)

Lines 37-50

Lines 63-76

36 37 addMouseMotionListener(38 39 new MouseMotionAdapter() {40 41 // determine icon over which mouse appears42 public void mouseMoved( MouseEvent event )43 {44 showStatus( translateLocation( 45 event.getX(), event.getY() ) );46 }47 48 } // end anonymous inner class49 50 ); // end addMouseMotionListener method call51 52 mapImage = new ImageIcon( "icons.png" ); 53 54 } // end method init55 56 // display mapImage57 public void paint( Graphics g )58 {59 mapImage.paintIcon( this, g, 0, 0 );60 }61 62 // return tip caption based on mouse coordinates63 public String translateLocation( int x, int y )64 {65 // if coordinates outside image, return immediately66 if ( x >= mapImage.getIconWidth() || 67 y >= mapImage.getIconHeight() ) 68 return "";69

Add MouseMotionListener for hot areas

Test coordinates to determine the icon over which the mouse

was positioned

Page 32: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

ImageMap.java (Part 3)

70 // determine icon number (0 - 6)71 int iconWidth = mapImage.getIconWidth() / 7;72 int iconNumber = x / iconWidth;73 74 // return appropriate icon caption75 return captions[ iconNumber ];76 }77 78 } // end class ImageMap

Page 33: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

ImageMap.java (Part 4)

Program Output

Page 34: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

ImageMap.java (Part 5)

Program Output

Page 35: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

Loading and Playing Audio Clips

• Playing audio clips– Method play of class Applet– Method play of class AudioClip– Java’s sound engine

• Supports several audio file formats

– Sun Audio (.au)

– Windows Wave (.wav)

– Macintosh AIFF (.aif or .aiff)

– Musical Instrument Digital Interface (MIDI) (.mid)

Page 36: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

import java.applet.AudioClip;import javax.swing.JApplet;

public class AudioExample extends JApplet{private AudioClip sound;public void init() {

sound = getAudioClip( getDocumentBase(), "welcome.wav" );

}public void start() {

sound.play();}

}

A simple Applet example with audio

Page 37: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

LoadAudioAndPlay.java

Line 13

1 // LoadAudioAndPlay.java2 // Load an audio clip and play it.3 4 // Java core packages5 import java.applet.*;6 import java.awt.*;7 import java.awt.event.*;8 9 // Java extension packages10 import javax.swing.*;11 12 public class LoadAudioAndPlay extends JApplet {13 private AudioClip sound1, sound2, currentSound; 14 private JButton playSound, loopSound, stopSound;15 private JComboBox chooseSound;16 17 // load the image when the applet begins executing18 public void init()19 {20 Container container = getContentPane();21 container.setLayout( new FlowLayout() );22 23 String choices[] = { "Welcome", "Hi" };24 chooseSound = new JComboBox( choices );25 26 chooseSound.addItemListener(27 28 new ItemListener() {29 30 // stop sound and change to sound to user's selection31 public void itemStateChanged( ItemEvent e )32 {33 currentSound.stop();34

Declare three AudioClip objects

Page 38: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

LoadAudioAndPlay.java (Part 2)

Lines 62-63

35 currentSound = 36 chooseSound.getSelectedIndex() == 0 ?37 sound1 : sound2;38 }39 40 } // end anonymous inner class41 42 ); // end addItemListener method call43 44 container.add( chooseSound );45 46 // set up button event handler and buttons47 ButtonHandler handler = new ButtonHandler();48 49 playSound = new JButton( "Play" );50 playSound.addActionListener( handler );51 container.add( playSound );52 53 loopSound = new JButton( "Loop" );54 loopSound.addActionListener( handler );55 container.add( loopSound );56 57 stopSound = new JButton( "Stop" );58 stopSound.addActionListener( handler );59 container.add( stopSound );60 61 // load sounds and set currentSound62 sound1 = getAudioClip( getDocumentBase(), "welcome.wav" );63 sound2 = getAudioClip( getDocumentBase(), "hi.au" );64 currentSound = sound1;65 66 } // end method init67

Method getAudioClip loads audio file into AudioClip object

Page 39: Introduction Multimedia –Use of sound, image, graphics and video –Makes applications “come alive”

LoadAudioAndPlay.java (Part 3)

Line 71

Line 81

Line 84

68 // stop the sound when the user switches Web pages69 public void stop()70 {71 currentSound.stop();72 }73 74 // private inner class to handle button events75 private class ButtonHandler implements ActionListener {76 77 // process play, loop and stop button events78 public void actionPerformed( ActionEvent actionEvent )79 {80 if ( actionEvent.getSource() == playSound ) 81 currentSound.play();82 83 else if ( actionEvent.getSource() == loopSound ) 84 currentSound.loop();85 86 else if ( actionEvent.getSource() == stopSound ) 87 currentSound.stop();88 }89 }90 91 } // end class LoadAudioAndPlay

Method stop stops playing the audio clip

Method play starts playing the audio clip

Method loops plays the audio clip continually