250 likes | 468 Views
18.1 Introduction. MultimediaUse of sound, image, graphics and videoMakes applications come alive". 18.1 Introduction (cont.). This chapter focuses onImage-manipulation basicsCreating smooth animationsCustomizing animation appletsPlaying audio files (via AudioClip interface)Creating imag
E N D
1. Chapter 18 – Multimedia: Images, Animation, Audio and Video
2. 18.1 Introduction Multimedia
Use of sound, image, graphics and video
Makes applications “come alive”
3. 18.1 Introduction (cont.) This chapter focuses on
Image-manipulation basics
Creating smooth animations
Customizing animation applets
Playing audio files (via AudioClip interface)
Creating image maps
4. 18.2 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
5. LoadImageAndScale.javaLines 14 and 20Lines 15 and 21Line 28Lines 32-33 1 // Fig. 18.1: LoadImageAndScale.java
2 // Load an image and display it in its original size
3 // and scale it to twice its original width and height.
4 // Load and display the same image as an ImageIcon.
5
6 // Java core packages
7 import java.applet.Applet;
8 import java.awt.*;
9
10 // Java extension packages
11 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 loaded
18 public void init()
19 {
20 logo1 = getImage( getDocumentBase(), "logo.gif" );
21 logo2 = new ImageIcon( "logo.gif" );
22 }
23
24 // display image
25 public void paint( Graphics g )
26 {
27 // draw original image
28 g.drawImage( logo1, 0, 0, this );
29
30 // draw image scaled to fit width of applet
31 // and height of applet minus 120 pixels
32 g.drawImage( logo1, 0, 120,
33 getWidth(), getHeight() - 120, this );
34
6. LoadImageAndScale.java (Part 2)Line 36Program Output 35 // draw icon using its paintIcon method
36 logo2.paintIcon( this, g, 180, 0 );
37 }
38
39 } // end class LoadImageAndScale
7. 18.3 Animating a Series of Images Demonstrate animating series of images
Images are stored in array
8. LogoAnimator.javaLines 14 and 34 1 // Fig. 18.2: LogoAnimator.java
2 // Animation a series of images
3
4 // Java core packages
5 import java.awt.*;
6 import java.awt.event.*;
7
8 // Java extension packages
9 import javax.swing.*;
10
11 public class LogoAnimator extends JPanel
12 implements ActionListener {
13
14 protected ImageIcon images[]; // array of images
15
16 protected int totalImages = 30, // number of images
17 currentImage = 0, // current image index
18 animationDelay = 50, // millisecond delay
19 width, // image width
20 height; // image height
21
22 protected String imageName = "deitel"; // base image name
23 protected Timer animationTimer; // Timer drives animation
24
25 // initialize LogoAnimator by loading images
26 public LogoAnimator()
27 {
28 initializeAnimation();
29 }
30
31 // initialize animation
32 protected void initializeAnimation()
33 {
34 images = new ImageIcon[ totalImages ];
35
9. LogoAnimator.java (Part 2)Lines 37-39Lines 46-52Lines 55-58 and 65 36 // load images
37 for ( int count = 0; count < images.length; ++count )
38 images[ count ] = new ImageIcon( getClass().getResource(
39 "images/" + imageName + count + ".gif" ) );
40
41 width = images[ 0 ].getIconWidth(); // get icon width
42 height = images[ 0 ].getIconHeight(); // get icon height
43 }
44
45 // display current image
46 public void paintComponent( Graphics g )
47 {
48 super.paintComponent( g );
49
50 images[ currentImage ].paintIcon( this, g, 0, 0 );
51 currentImage = ( currentImage + 1 ) % totalImages;
52 }
53
54 // respond to Timer's event
55 public void actionPerformed( ActionEvent actionEvent )
56 {
57 repaint(); // repaint animator
58 }
59
60 // start or restart animation
61 public void startAnimation()
62 {
63 if ( animationTimer == null ) {
64 currentImage = 0;
65 animationTimer = new Timer( animationDelay, this );
66 animationTimer.start();
67 }
68 else // continue from last image displayed
69 if ( ! animationTimer.isRunning() )
70 animationTimer.restart();
10. LogoAnimator.java (Part 3)Line 76 71 }
72
73 // stop animation timer
74 public void stopAnimation()
75 {
76 animationTimer.stop();
77 }
78
79 // return minimum size of animation
80 public Dimension getMinimumSize()
81 {
82 return getPreferredSize();
83 }
84
85 // return preferred size of animation
86 public Dimension getPreferredSize()
87 {
88 return new Dimension( width, height );
89 }
90
91 // execute animation in a JFrame
92 public static void main( String args[] )
93 {
94 // create LogoAnimator
95 LogoAnimator animation = new LogoAnimator();
96
97 // set up window
98 JFrame window = new JFrame( "Animator test" );
99
100 Container container = window.getContentPane();
101 container.add( animation );
102
103 window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
104
11. LogoAnimator.java (Part 4) 105 // size and display window
106 window.pack();
107 Insets insets = window.getInsets();
108
109 window.setSize( animation.getPreferredSize().width +
110 insets.left + insets.right,
111 animation.getPreferredSize().height +
112 insets.top + insets.bottom );
113
114 window.setVisible( true );
115 animation.startAnimation(); // begin animation
116
117 } // end method main
118
119 } // end class LogoAnimator
12. 18.4 Customizing LogoAnimator via Applet Parameters Customize applet via changing applet parameters
<html><applet code = "LogoApplet.class" width = 400 height = 400><param name = "totalImages" value = "30"><param name = "imagename" value = "deitel"><param name = "animationdelay" value = "200"></applet></html>
13. LogoAnimator2.javaLines 10 and 19-26 1 // Fig. 18.3: LogoAnimator2.java
2 // Animating a series of images
3
4 // Java core packages
5 import java.awt.*;
6
7 // Java extension packages
8 import javax.swing.*;
9
10 public class LogoAnimator2 extends LogoAnimator {
11
12 // default constructor
13 public LogoAnimator2()
14 {
15 super();
16 }
17
18 // new constructor to support customization
19 public LogoAnimator2( int count, int delay, String name )
20 {
21 totalImages = count;
22 animationDelay = delay;
23 imageName = name;
24
25 initializeAnimation();
26 }
27
28 // start animation as application in its own window
29 public static void main( String args[] )
30 {
31 // create LogoAnimator
32 LogoAnimator2 animation = new LogoAnimator2();
33
34 // set up window
35 JFrame window = new JFrame( "Animator test" );
14. LogoAnimator2.java (Part 2) 36
37 Container container = window.getContentPane();
38 container.add( animation );
39
40 window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
41
42 // size and display window
43 window.pack();
44 Insets insets = window.getInsets();
45
46 window.setSize( animation.getPreferredSize().width +
47 insets.left + insets.right,
48 animation.getPreferredSize().height +
49 insets.top + insets.bottom );
50
51 window.setVisible( true );
52 animation.startAnimation(); // begin animation
53
54 } // end method main
55
56 } // end class LogoAnimator2
15. LogoApplet.javaLine 31 1 // Fig. 18.4: LogoApplet.java
2 // Customizing an applet via HTML parameters.
3 //
4 // HTML parameter "animationdelay" is an int indicating
5 // milliseconds to sleep between images (default 50).
6 //
7 // HTML parameter "imagename" is the base name of the images
8 // that will be displayed (i.e., "deitel" is the base name
9 // for images "deitel0.gif," "deitel1.gif," etc.). The applet
10 // assumes that images are in an "images" subdirectory of
11 // the directory in which the applet resides.
12 //
13 // HTML parameter "totalimages" is an integer representing the
14 // total number of images in the animation. The applet assumes
15 // images are numbered from 0 to totalimages - 1 (default 30).
16
17 // Java core packages
18 import java.awt.*;
19
20 // Java extension packages
21 import javax.swing.*;
22
23 public class LogoApplet extends JApplet {
24
25 // obtain parameters from HTML and customize applet
26 public void init()
27 {
28 String parameter;
29
30 // get animation delay from HTML document
31 parameter = getParameter( "animationdelay" );
32
33 int animationDelay = ( parameter == null ?
34 50 : Integer.parseInt( parameter ) );
35
16. LogoApplet.java (Part 2)Line 37Line 40Lines 51-52 36 // get base image name from HTML document
37 String imageName = getParameter( "imagename" );
38
39 // get total number of images from HTML document
40 parameter = getParameter( "totalimages" );
41
42 int totalImages = ( parameter == null ?
43 0 : Integer.parseInt( parameter ) );
44
45 // create instance of LogoAnimator
46 LogoAnimator2 animator;
47
48 if ( imageName == null || totalImages == 0 )
49 animator = new LogoAnimator2();
50 else
51 animator = new LogoAnimator2( totalImages,
52 animationDelay, imageName );
53
54 // attach animator to applet and start animation
55 getContentPane().add( animator );
56 animator.startAnimation();
57
58 } // end method init
59
60 } // end class LogoApplet
17. 18.5 Image Maps Image map
Contains hot areas
Message appears when user moves cursor over these areas
18. ImageMap.javaLines 23-35 1 // Fig. 18.5: ImageMap.java
2 // Demonstrating an image map.
3
4 // Java core packages
5 import java.awt.*;
6 import java.awt.event.*;
7
8 // Java extension packages
9 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 listeners
21 public void init()
22 {
23 addMouseListener(
24
25 new MouseAdapter() {
26
27 // indicate when mouse pointer exits applet area
28 public void mouseExited( MouseEvent event )
29 {
30 showStatus( "Pointer outside applet" );
31 }
32
33 } // end anonymous inner class
34
35 ); // end addMouseListener method call
19. ImageMap.java (Part 2)Lines 37-50Lines 63-76 36
37 addMouseMotionListener(
38
39 new MouseMotionAdapter() {
40
41 // determine icon over which mouse appears
42 public void mouseMoved( MouseEvent event )
43 {
44 showStatus( translateLocation(
45 event.getX(), event.getY() ) );
46 }
47
48 } // end anonymous inner class
49
50 ); // end addMouseMotionListener method call
51
52 mapImage = new ImageIcon( "icons.png" );
53
54 } // end method init
55
56 // display mapImage
57 public void paint( Graphics g )
58 {
59 mapImage.paintIcon( this, g, 0, 0 );
60 }
61
62 // return tip caption based on mouse coordinates
63 public String translateLocation( int x, int y )
64 {
65 // if coordinates outside image, return immediately
66 if ( x >= mapImage.getIconWidth() ||
67 y >= mapImage.getIconHeight() )
68 return "";
69
20. 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 caption
75 return captions[ iconNumber ];
76 }
77
78 } // end class ImageMap
21. ImageMap.java (Part 4)Program Output
22. ImageMap.java (Part 5)Program Output
23. 18.6 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)
24. LoadAudioAndPlay.javaLine 13 1 // Fig. 18.6: LoadAudioAndPlay.java
2 // Load an audio clip and play it.
3
4 // Java core packages
5 import java.applet.*;
6 import java.awt.*;
7 import java.awt.event.*;
8
9 // Java extension packages
10 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 executing
18 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 selection
31 public void itemStateChanged( ItemEvent e )
32 {
33 currentSound.stop();
34
25. LoadAudioAndPlay.java (Part 2)Lines 62-63 35 currentSound =
36 chooseSound.getSelectedIndex() == 0 ?
37 sound1 : sound2;
38 }
39
40 } // end anonymous inner class
41
42 ); // end addItemListener method call
43
44 container.add( chooseSound );
45
46 // set up button event handler and buttons
47 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 currentSound
62 sound1 = getAudioClip( getDocumentBase(), "welcome.wav" );
63 sound2 = getAudioClip( getDocumentBase(), "hi.au" );
64 currentSound = sound1;
65
66 } // end method init
67
26. LoadAudioAndPlay.java (Part 3)Line 71Line 81Line 84 68 // stop the sound when the user switches Web pages
69 public void stop()
70 {
71 currentSound.stop();
72 }
73
74 // private inner class to handle button events
75 private class ButtonHandler implements ActionListener {
76
77 // process play, loop and stop button events
78 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