JAVA范例 十九) 多媒体与图像处理

a多媒体

实例349 测试音频播放器

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class OggPlay extends JFrame {
private JPanel contentPane;
private JTextField jtextField = new JTextField();// 用于输入声音文件的地址
private JLabel jLabel = new JLabel(); // 用于显示播放器的状态信息
private JPanel jPanel = new JPanel(); // 用于包容下面两个JButton对象
// 用于控制播放和停止声音文件
private JButton jbutton1 = new JButton();
private JButton jbutton2 = new JButton();
private AudioClip clip; // 用于播放声音文件
private void init() throws Exception {
contentPane = (JPanel) this.getContentPane();
this.setSize(new Dimension(418, 118));
this.setTitle("音频片断播放器");
jLabel.setFont(new Font("Dialog", 0, 12));
jLabel.setToolTipText("");
jLabel.setText("准备就续");// 播放器的初始状态信息
jbutton1.setFont(new Font("Dialog", 0, 12));
jbutton1.setText("播放");
jbutton1.addActionListener(new ActionListener() {// 添加ActionListener
public void actionPerformed(ActionEvent e) {
jbutton1_actionPerformed(e);
}
});
jbutton2.setEnabled(false);// "停止"按钮初始为不可访问
jbutton2.setFont(new Font("Dialog", 0, 12));
jbutton2.setText("停止");
jbutton2.addActionListener(new ActionListener() {// 添加ActionListener
public void actionPerformed(ActionEvent e) {
jbutton2_actionPerformed(e);
}
});
// 设置初始的声音文件路径,读者可以自定义路径和设备名称
jtextField.setText(ClassLoader.getSystemResource("aa.wav").toString());
contentPane.add(jLabel, BorderLayout.SOUTH);
contentPane.add(jPanel, BorderLayout.CENTER);
jPanel.add(jbutton1, null);
jPanel.add(jbutton2, null);
contentPane.add(jtextField, BorderLayout.NORTH);
clip = null;// 声音剪辑对象初始化为null
this.show();
}
public void jbutton1_actionPerformed(ActionEvent e) {
try {
jbutton1.setEnabled(false);
jbutton2.setEnabled(true);
// 实例化一个AudioClip对象clip,将声音文件的数据存入clip对象中
clip = Applet.newAudioClip(new URL(this.jtextField.getText()));
System.out.println(this.jtextField.getText());
// 开始播放clip对象中的声音数据
clip.play();
// 显示播放器的状态信息
this.jLabel.setText("正在播放:" + this.jtextField.getText());
} catch (Exception err) {
err.printStackTrace();
}
}
public void jbutton2_actionPerformed(ActionEvent e) {
try {
jbutton1.setEnabled(true);
jbutton2.setEnabled(false);
// 停止播放clip对象中的声音数据
clip.stop();
// 显示播放器的状态信息
this.jLabel.setText("准备就绪");
} catch (Exception err) {
err.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
new OggPlay().init();
}
}


实例350 测试视频播放器

import java.awt.*;
import java.io.IOException;

import javax.media.*;
import javax.swing.*;

public class RealOnePlayer extends JFrame implements ControllerListener {
private JPanel jp;

private BorderLayout bl = new BorderLayout();

Component cp1 = null;// 创建一个视频播放组件

Component cp2 = null;// 创建一个视频播放组件

Player player = null;// 播放器对象

public RealOnePlayer(String url) {
this.setTitle("JMF视频播放器");
try {
Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, new Boolean(true));// 这一行很重要,可以解决Swing组件和AWT组件混用带来的麻烦
player = Manager.createPlayer(new MediaLocator(url));
} catch (NoPlayerException e) {
exitProc("找不到播放器!");// 显示消息并退出程序
} catch (IOException e) {
exitProc("不能创建播放器!");// 显示消息并退出程序
}
if (player == null) {
exitProc("不能创建播放器!");// 显示消息并退出程序
}
player.addControllerListener(this);// 添加ControllerListener监听器
player.prefetch();// 获取媒体数据
}

public void controllerUpdate(ControllerEvent e) {
if (e instanceof ControllerClosedEvent) {// 如果控制事件是关闭,就退出程序
System.exit(0);
}
if (e instanceof EndOfMediaEvent) {// 如果控制事件是媒体数据播放完毕,则player设置新的媒体时间,重新开始播放
player.setMediaTime(new Time(0));
player.start();
return;
}
if (e instanceof PrefetchCompleteEvent) {// 如果控制事件是获得媒体数据完成,则开始播放
player.start();
return;
}
// 如果控制事件是Realize完成,则播放器player获得播放画面的组件,用于媒体可视化播放,并将组件加到MediaDemo_2窗口中,同时获得播放控制组件,也添加到MediaDemo_2窗口上,用于控制媒体的播放
if (e instanceof RealizeCompleteEvent) {
Component vc = player.getVisualComponent();
if (vc != null) {
this.getContentPane().add(vc, BorderLayout.CENTER);
Component cc = player.getControlPanelComponent();
if (cc != null) {
this.getContentPane().add(cc, BorderLayout.SOUTH);
this.pack();
this.setResizable(false);// 窗口大小适合媒体画面,并不可改变
this.setVisible(true);// 显示页面
}
}
}
}

private void exitProc(String str) {
System.out.println(str);
System.exit(-1);
}

public static void main(String[] args) {
RealOnePlayer md = new RealOnePlayer(ClassLoader.getSystemResource(
"lift.mpeg").toString());
}

}


实例351 视频反色效果

import java.awt.*;
import java.io.IOException;

import javax.media.Buffer;
import javax.media.Codec;
import javax.media.ControllerClosedEvent;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.Controls;
import javax.media.Effect;
import javax.media.EndOfMediaEvent;
import javax.media.Format;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoProcessorException;
import javax.media.NotConfiguredError;
import javax.media.Processor;
import javax.media.RealizeCompleteEvent;
import javax.media.Time;
import javax.media.UnsupportedPlugInException;
import javax.media.control.TrackControl;
import javax.media.format.RGBFormat;
import javax.swing.*;

public class Media11 extends JFrame implements ControllerListener {
private JPanel contentPane;

private BorderLayout bl = new BorderLayout();

Component vc = null;// 媒体播放画面组件

Component cc = null;// 媒体播放控制组件

TrackControl[] tc = null;// 各条媒体踪迹的数据控制处理对象

Processor p = null;// 媒体处理器,控制整个媒体的播放过程

public Media11(String mediaURL) {

Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, new Boolean(true));// 处理swing组件和awt组件的冲突
MediaLocator ml = new MediaLocator(mediaURL);
try {
p = Manager.createProcessor(ml);
} catch (NoProcessorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}// 根据媒体定位对象,实例化一个处理器exitProc()方法向屏幕显示信息,并退出程序
if (p == null) {
exitProc("不能创建播放器!");

}
p.addControllerListener(this);// 添加处理器的控制状态变化监听器
p.configure();// 初始化处理器的设置
while (p.getState() != p.Configured)
;
p.setContentDescriptor(null);// 如果处理器不能完成初始设置,则设置媒体上下文描述器
tc = p.getTrackControls();// 处理器得到媒体数据的所有踪迹控制处理对象
if (tc.length > 0) {
Codec[] cd = new Codec[1];
cd[0] = new NegativeEffect();// 设置媒体编码器为经NegativeEffect对象处理后的编码器
try {
tc[0].setCodecChain(cd);
} catch (UnsupportedPlugInException e) {
e.printStackTrace();
} catch (NotConfiguredError e) {
e.printStackTrace();
}// 指定一条将在每条媒体踪迹中使用的编码器插件链

}
p.realize();// 处理器进入realizing状态
}

public void controllerUpdate(ControllerEvent e) {// 如果事件是控制器关闭事件、则正常退出程序
if (e instanceof ControllerClosedEvent)
System.exit(0);
// 如果是媒体播放完毕,则重新设置媒体时间
if (e instanceof EndOfMediaEvent) {
p.setMediaTime(new Time(0));
return;
}
// 如是是Realize完成,则处理器获得可视化的播放画面组件,实例化vc对象并添加到主窗口中;同时获得播放控制组件,实例化cc对象,并添加到主窗口中
if (e instanceof RealizeCompleteEvent) {
vc = p.getVisualComponent();
if (vc != null)
this.getContentPane().add(vc, BorderLayout.CENTER);
cc = p.getControlPanelComponent();
if (cc != null)
this.getContentPane().add(cc, BorderLayout.SOUTH);
// 调整主窗口属性,并使窗口适合媒体画面大小,而不可改变
this.pack();
this.setResizable(false);
this.setVisible(true);

}
}

public void exitProc(String str) {
System.out.println(str);
System.exit(-1);
}

public static void main(String[] args) {
new Media11(ClassLoader.getSystemResource("lift.mpeg").toString());
}

}

class NegativeEffect implements Effect {
private static String EffectName = "NegativeEffect";

protected RGBFormat inputFormat;// 输入的RGB色彩格式

protected RGBFormat outputFormat;// 输出的RGB色彩格式

protected Format[] supportedInputFormats;// 所有支持的输入格式

protected Format[] supportedOutputFormats;// 所有支持的输出格式

// 构造方法,实例化所有支持的输入输出色彩为RGB色彩格式
public NegativeEffect() {
supportedInputFormats = new Format[] { new RGBFormat() };
supportedOutputFormats = new Format[] { new RGBFormat() };
}

// 实现Effect接口继承自Codec的方法,返回所有支持的输入格式
public Format[] getSupportedInputFormats() {
System.out.println("getSupportedInputFormats");
return supportedInputFormats;
}

// 实现Effect接口继承自Codec的方法,返回所有支持的输出格式
public Format[] getSupportedOutputFormats(Format parm) {
System.out.println("getSupportedOutputFormats[in = " + parm + "]");
// 如果传入的Format对象parm不是RGBFormat实例,则返回默认的RGBFormat格式对象
if (parm == null)
return supportedOutputFormats;
if (!(parm instanceof RGBFormat))
return new Format[0];
// 如果是,根据该格式返回一个对象引用
RGBFormat rf = (RGBFormat) parm;
RGBFormat rfb = (RGBFormat) parm.clone();
return new Format[] { rfb };
}

// 实现Effect接口继承自Codec的方法,返回传入的数据格式
public Format setInputFormat(Format parm) {
System.out.println("setInputFormatInput[input=" + parm + "]");
inputFormat = (RGBFormat) parm;
return (RGBFormat) inputFormat;
}

// 实现Effect接口继承自Codec的方法,返回传入的数据格式
public Format setOutputFormat(Format parm) {
System.out.println("setOutputFormat[output=" + parm + "]");
outputFormat = (RGBFormat) parm;
return (RGBFormat) outputFormat;
}

// 不一定要实现的两个方法,仅仅满足get、set的对称性
public Format getInputFormat() {
System.out.println("getInputFormat");
return inputFormat;
}

public Format getOutputFormat() {
System.out.println("getOutputFormat");
return outputFormat;
}

// 实现Effect接口自Codec的方法,处理输入的媒体数据parm,得到经处理的输出的媒体数据parm,该方法完成本类的效用,处理媒体数据,达到使色彩反色输出的处理效果是本类的核心方法
public int process(Buffer parm1, Buffer parm2) {
Object o = parm1.getData();// 获得输入的数据对象的引用
int inLength = parm1.getLength();// 输入的数据的长度
int inOffset = parm1.getOffset();// 偏移量
// 如果输入输出的媒体数据非合法的short[]int[]形式,返回出错信息
if (!(o instanceof short[]) && !(o instanceof int[]))
return this.BUFFER_PROCESSED_FAILED;
Object oo = parm2.getData();
if (oo != null) {
if (!(oo instanceof short[]) && !(oo instanceof int[]))
return this.BUFFER_PROCESSED_FAILED;
} else {
// 根据输入的数据长度,设置输出的数据长度
if (o instanceof short[])
parm2.setData(new short[inLength]);
else
parm2.setData(new int[inLength]);
oo = parm2.getData();
}
// 根据输入的数据偏移量,设置输出的数据偏移量
int outOffset = parm2.getOffset();
if (o instanceof short[]) {
short[] inData = (short[]) o;
short[] outData = (short[]) oo;
// 处理输入的媒体数据,将色彩取反,并将数据放入输出的媒体数据对象中
for (int i = 0; i < inLength; i++)
outData[outOffset++] = (short) -inData[inOffset++];
} else {
int[] inData = (int[]) o;
int[] outData = (int[]) oo;
for (int i = 0; i < inLength; i++)
outData[outOffset++] = -inData[inOffset++];
}
// 设置输出媒体数据的格式
parm2.setFormat(outputFormat);
// 设置输出媒体数据的长度和偏移
parm2.setLength(inLength);
parm2.setOffset(0);
// 返回数据处理成功完成信息
return this.BUFFER_PROCESSED_OK;
}

// 返回类名
public String getName() {
System.out.println("getName");
return EffectName;
}

// 以下的方法不一定要求实现,这些方法是Effect接口的父类的上层类
public void open() {
System.out.println("open");
}

public void close() {
System.out.println("close");
}

public void reset() {
System.out.println("reset");
}

public Object[] getControls() {
System.out.println("getControls");
return new Controls[0];
}

public Object getControl(String parm1) {
System.out.println("getControl[controlType=" + parm1 + "]");
Class clas = null;
try {
Object[] cs = this.getControls();
for (int i = 0; i < cs.length; i++) {
if (clas.isInstance(cs[i])) {
return cs[i];
}
}
clas = Class.forName(parm1);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

return null;
}

}


实例352 实现一个录音机

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.util.Vector;

import javax.media.*;
import javax.media.datasink.*;
import javax.media.format.AudioFormat;
import javax.media.protocol.*;
import javax.media.control.StreamWriterControl;
import javax.swing.*;

//录音机
public class Recorder extends JFrame implements ActionListener,
DataSinkListener {
private JPanel contentPane;

private BorderLayout borderLayout = new BorderLayout();

StateHelper sh;

Processor processor;

DataSink fileWriter = null;

private JButton btStart = new JButton(" Start ");

private JButton btStop = new JButton(" Stop ");

private JLabel jLabel = new JLabel("录间机演示", SwingConstants.CENTER);

private void initial() throws Exception {
// 添加按扭的事件监听器
this.btStart.addActionListener(this);
this.btStop.addActionListener(this);
contentPane = new JPanel(borderLayout);
// 添加按扭到指定位置
contentPane.add(this.btStart, BorderLayout.WEST);
contentPane.add(this.jLabel, BorderLayout.CENTER);
contentPane.add(this.btStop, BorderLayout.EAST);
this.add(contentPane);
this.setSize(350, 120);
this.setVisible(true);
// 申明一个捕获设备信息类,用于得到本机上的声音捕获相关设备信息
CaptureDeviceInfo cdi = null;
AudioFormat af = new AudioFormat(AudioFormat.LINEAR, 8000, 16, 1);// 创建一个指定参数的声音媒体格式
// 获得设备信息
Vector deviceList = CaptureDeviceManager.getDeviceList(af);
if (deviceList.size() > 0) {
cdi = (CaptureDeviceInfo) deviceList.firstElement();// 使用第一个设备
} else {
exitProc("Could not find audiodevice");// 设备都不可用,退出程序
}
// 实例化一个处理器
processor = Manager.createProcessor(cdi.getLocator());
// 实例化一个实现ControllerListener接口的类,处理控制状态变化事件
sh = new StateHelper(processor);
// 设置超时10000ms 退出
if (!sh.configure(10000)) {
exitProc("Could not configure processon");
}
// 用于在磁盘上指定存储获取的声音数据文件
FileTypeDescriptor ftd = new FileTypeDescriptor(
FileTypeDescriptor.BASIC_AUDIO);
processor.setContentDescriptor(ftd);
if (sh.realize(10000)) {
exitProc("Could not realize processor");
}

}

public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
((Component) e.getSource()).setEnabled(false);// 按扭单击后变为不可访问状态
// 如查被单击的是"Start"按扭,则开始录音,并将声音数据写到指定的文件中
if (cmd.equals("Start")) {
DataSource source = processor.getDataOutput();
MediaLocator dest = new MediaLocator("file:/c:/out.au");
try {
fileWriter = Manager.createDataSink(source, dest);
fileWriter.addDataSinkListener(this);
fileWriter.open();
} catch (NoDataSinkException err) {
exitProc("Could not create data sink");
} catch (IOException ee) {
ee.printStackTrace();
}
// 设置声音数据的长度限制为10000000B
StreamWriterControl swc = (StreamWriterControl) processor
.getControl("javax.media.control.StreamWriterControl");
if (swc != null) {
swc.setStreamSizeLimit(10000000);
}
try {
fileWriter.start();
} catch (IOException err) {
System.out.println(err.toString());
}
processor.start();
return;
}
// 如果单击的是"Stop"按扭,则关闭处理器
processor.stop();
processor.close();

}

public void dataSinkUpdate(DataSinkEvent e) {
if (e instanceof EndOfStreamEvent) {
fileWriter.close();
System.exit(0);
}

}

public void exitProc(String str) {
System.out.println(str);
System.exit(-1);
}

public static void main(String args[]) throws Exception {
new Recorder().initial();
}

}

class StateHelper implements ControllerListener {
Player player = null;

boolean configured = false;

boolean realized = false;

boolean prefetched = false;

boolean failed = false;

boolean closed = false;

// 构造方法的传入参数是Player对象
public StateHelper(Player player) {
this.player = player;
this.player.addControllerListener(this);

}

// 完成configure操作
public boolean configure(int timeOutMillis) {
long startTime = System.currentTimeMillis();
synchronized (this) {
if (player instanceof Processor) {
((Processor) player).configure();
} else {
return false;
}
while (!configured && !failed) {
try {
wait(timeOutMillis);
} catch (Exception e) {

}
if (System.currentTimeMillis() - startTime > timeOutMillis)
break;
}

}
return this.configured;

}

// 完成realize操作
public boolean realize(int timeOutMillis) {
long startTime = System.currentTimeMillis();
synchronized (this) {
player.realize();
while (!realized && !failed) {
try {
wait(timeOutMillis);
} catch (Exception e) {

}
if (System.currentTimeMillis() - startTime > timeOutMillis)
break;
}

}
return this.realized;

}

// 完成prefetch操作
public boolean prefetch(int timeOutMillis) {
long startTime = System.currentTimeMillis();
synchronized (this) {
player.prefetch();
while (!prefetched && !failed) {
try {
wait(timeOutMillis);
} catch (Exception e) {

}
if (System.currentTimeMillis() - startTime > timeOutMillis)
break;
}

}
return this.prefetched;

}

public void close() {
synchronized (this) {
player.close();// 关闭播放器
while (!closed) {// 如果closed为false,则等待100ms完成程序结束处理
try {
wait(100);
} catch (Exception e) {

}
}

}
player.removeControllerListener(this);// 撤销播放器的控制监听器
}

// 处理ControllerEvent事件
public void controllerUpdate(ControllerEvent e) {
if (e instanceof RealizeCompleteEvent) {
this.realized = true;
} else if (e instanceof ConfigureCompleteEvent) {
this.configured = true;
} else if (e instanceof PrefetchCompleteEvent) {
this.prefetched = true;
} else if (e instanceof ControllerErrorEvent) {
this.failed = true;
} else if (e instanceof ControllerClosedEvent) {
this.closed = true;
} else {
return;
}
}

}

实例353 建立一个调色板

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class CPalette extends JFrame implements ChangeListener {
private JPanel contendtPane;
private BorderLayout borderLayout1 = new BorderLayout();
private JPanel jPanel1 = new JPanel();
private JPanel jPanel2 = new JPanel();
private GridLayout gridLayout1 = new GridLayout();
private JSlider redSlider = new JSlider();// 调节红色
private JSlider greenSlider = new JSlider();// 调节绿色
private JSlider blueSlider = new JSlider();// 调节蓝色
private JSlider alphaSlider = new JSlider();// 调节Alpha值
private TitledBorder titledBorder1;
private TitledBorder titledBorder2;
private TitledBorder titledBorder3;
private TitledBorder titledBorder4;
private JLabel jLabel = new JLabel();
ColorCanvas canvas = new ColorCanvas();// 创建ColorCanvas的实例
private BorderLayout borderLayout2 = new BorderLayout();
public void initial() throws Exception {
contendtPane = (JPanel) this.getContentPane();
// 各个JSlider对象的标题边界
titledBorder1 = new TitledBorder(BorderFactory.createEtchedBorder(
Color.white, new Color(142, 142, 142)), "Red");
titledBorder2 = new TitledBorder(BorderFactory.createEtchedBorder(
Color.white, new Color(142, 142, 142)), "Green");
titledBorder3 = new TitledBorder(BorderFactory.createEtchedBorder(
Color.white, new Color(142, 142, 142)), "Blue");
titledBorder4 = new TitledBorder(BorderFactory.createEtchedBorder(
Color.white, new Color(142, 142, 142)), "Alpha");
contendtPane.setLayout(borderLayout1);
this.setSize(new Dimension(401, 317));
this.setTitle("JColorDemo");
// jPanel2的布局结构设置
jPanel2.setLayout(gridLayout1);
gridLayout1.setColumns(2);
gridLayout1.setHgap(5);
gridLayout1.setRows(2);
gridLayout1.setVgap(5);
// 设置各个JSlider对象的基本属性
redSlider.setMaximum(255);// 最大色彩值
redSlider.setPaintLabels(true);// 绘制标签
redSlider.setPaintTicks(true);// 绘制移动块
redSlider.setBorder(titledBorder1);// 设置边界
greenSlider.setMaximum(255);
greenSlider.setPaintLabels(true);
greenSlider.setPaintTicks(true);
greenSlider.setBorder(titledBorder2);
blueSlider.setMaximum(255);
blueSlider.setPaintLabels(true);
blueSlider.setPaintTicks(true);
blueSlider.setBorder(titledBorder3);
alphaSlider.setMaximum(255);
alphaSlider.setPaintLabels(true);
alphaSlider.setPaintTicks(true);
alphaSlider.setBorder(titledBorder4);
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
jLabel.setText("调色板程序演示");
jPanel1.setLayout(borderLayout2);
contendtPane.add(jPanel1, BorderLayout.CENTER);
contendtPane.add(jPanel2, BorderLayout.SOUTH);
jPanel2.add(redSlider, null);
jPanel2.add(greenSlider, null);
jPanel2.add(blueSlider, null);
jPanel2.add(alphaSlider, null);
contendtPane.add(jLabel, BorderLayout.NORTH);
// 添加各个JSlider对象的事件监听器
this.redSlider.addChangeListener(this);
this.greenSlider.addChangeListener(this);
this.blueSlider.addChangeListener(this);
this.alphaSlider.addChangeListener(this);
// jPanel1上添加canvas对象,用来显示当前的颜色
this.jPanel1.add(this.canvas);
this.setVisible(true);
}
public void stateChanged(ChangeEvent e) {
JSlider slider = (JSlider) e.getSource();
// 根据JSlider对象的改变后的值,改变canvas对象的各色彩值,并重新设置canvas的背景色
if (slider == this.redSlider) {
this.canvas.redValue = slider.getValue();
this.canvas.setBackgroudnColor();
} else if (slider == this.greenSlider) {
this.canvas.greenValue = slider.getValue();
this.canvas.setBackgroudnColor();
} else if (slider == this.blueSlider) {
this.canvas.blueValue = slider.getValue();
this.canvas.setBackgroudnColor();
} else if (slider == this.alphaSlider) {
this.canvas.alphaValue = slider.getValue();
this.canvas.setBackgroudnColor();
}
// 更新canvas对象的背景色,显示颜色值改变后的颜色
this.canvas.repaint();
}
public static void main(String args[]) throws Exception {
new CPalette().initial();
}
}
class ColorCanvas extends Canvas {
Color color;// 各颜色值形成的颜色
int redValue, greenValue, blueValue;// 各颜色值
int alphaValue = 255;
public ColorCanvas() {
this.color = new Color(0, 0, 0);// 初始颜色
this.setBackgroudnColor();// 设置初始的背景色
}
// 该方法根据各颜色值,来设置canvas对象的背景色
public void setBackgroudnColor() {
this.color = new Color(this.redValue, this.greenValue, this.blueValue,
this.alphaValue);
this.setBackground(this.color);
}
}
Java多媒体技术. Java多媒体技术 多媒体编程基础java的,不多啊好东西 立即下载

相关推荐

2025-E题国一-简易自行瞄准装置:基于嘉立创地猛星/天猛星与K230的视觉巡线云台系统设计

本文详细介绍了2025年全国大学生电子设计竞赛E题一等奖作品——基于嘉立创地猛星/天猛星与K230的视觉巡线云台系统设计。该系统通过地猛星主控实现小车巡线,天猛星主控驱动云台,结合K230开发板的视觉识别能力,构建了一套完整的视觉巡线云台系统,实现了自动巡线与精准瞄准功能。文章深入剖析了硬件选型、双闭环PID控制算法、视觉识别与目标跟踪等核心技术,并分享了系统调试与避坑经验。

weixin_42596011的博客 674

java多媒体处理

方法一 <!--引入全平台windows 32/64 linux 32/64 下的ffmpeg 可执行程序,实际运行不需要这么多--> <!--<dependency> <groupId>ws.schild</groupId> <artifactId>jave-all-deps</artifactId> <version>3.2

WaiChuQiTao的博客 2389

W5500以太网模块官方驱动移植

W5500驱动移植

weixin_42621095的博客 4126

如何在Java中实现高效的流媒体处理:从FFmpeg到WebRTC

虽然FFmpeg本身是用C语言编写的,但在Java中我们可以通过JNI(Java Native Interface)或者JNA(Java Native Access)来调用FFmpeg的功能。FFmpeg可以用于流的预处理,如转码、添加水印等,而WebRTC则可以处理流的实时传输。无论是需要处理离线的音视频文件,还是进行实时音视频通信,这两种工具都能够提供强大的支持。Java作为一种跨平台的编程语言,其丰富的库和工具集使得流媒体处理在Java中同样可以高效实现。在上面的代码中,我们通过。

微赚淘客系统开发者博客 1632

深入解析XTEA加密算法的核心机制与优化策略

本文深入解析XTEA加密算法的核心机制与优化策略,详细介绍了XTEA在嵌入式系统和资源受限环境中的优势,包括其高效的加解密速度和低资源消耗。文章还探讨了XTEA的轮函数设计、关键参数优化策略以及实战应用中的性能对比,为开发者提供了安全增强方案和优化技巧。

k8l9m0n的博客 242

深入解析JESD204B Subclass 1中的SYSREF与LMFC同步机制

本文深入解析了JESD204B Subclass 1协议中的核心同步机制,重点阐述了SYSREF信号如何作为系统级参考,对齐所有设备内部的本地多帧时钟(LMFC),从而实现高速多通道数据采集系统中的确定性延迟。文章结合实战经验,详细说明了硬件设计、时序要点及软件配置流程,是解决多ADC芯片同步对齐问题的关键指南。

weixin_29271263的博客 398

Java多媒体应用JMF

用于现场拍照,生成照片,主要用到Java Media Framework(JMF)。   首先到SUN下载最新的JMF,然后安装。http://java.sun.com/products/java-media/jmf/index.jsp       或者在我的附件里面找到JMF下载安装。   然后,说一下需求   1. 用摄像头拍照   2. 按下拍照按钮,获取摄像头内的图像   3. 保存为本...

ypf3027的专栏 184

Python实现飞书机器人定时发送文本、图片等群消息

python实现飞书群自动发送告警消息

tyh_keephunger的博客 2万+

Java 播放多媒体 谈Java Media Framework

很多Java初学者想在制作的Java小程序中插入一段视频或者多媒体,却感到无所适从。因为Java的多媒体涉及到一个叫做Java media framework的API。本文就结合作者完成一次多媒体播放器的制作经历,详细论述Java Media Framework导入以及实现的相关攻略。   需要准备的开发工具(IDE):eclipse-luna   1. 下载JMF API。下载JMF

SamYjy的博客 6515

PV-RCNN实战:如何在KITTI数据集上实现3D目标检测(附完整代码解析)

本文提供了在KITTI数据集上实战PV-RCNN 3D目标检测的完整指南,涵盖环境配置、数据预处理、模型训练与评估全流程。通过详细的代码解析和调参技巧,帮助读者掌握这一融合点与体素优势的经典3D目标检测模型,并实现从理论到实践的跨越。

weixin_29098391的博客 403

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

锂电池寿命预测 | Pytorch实现基于Transformer 的锂电池寿命预测(NASA数据集)

算法如诗的博客 5586

JAVA范例 十九) 多媒体与图像处理 (二)

图像处理 实例354 在计算机内存中创建一个图像 [code="java"]import java.awt.BorderLayout; import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt....

A+ 219

SAP PFCG 中的单一角色与复合角色

在 SAP 系统的安全与授权管理中,事务码 PFCG(角色维护)扮演着关键角色。理解单一角色(Single Role)和复合角色(Composite Role)的概念,对于有效地管理用户权限至关重要。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1477

十九章Java博客

执行图像从源到目标的缩放,要将源矩形的第一个坐标映射到目标矩形的第一个坐标,源矩形的第二个坐标映射到目标矩形的第二个坐标,按需要缩放和翻转子图像,以保持这些映射关系。Graphics2D类是在继承Graphics类的基础上编写的,它包含了Graphics类的绘图方法并添加了更强的功能,在创建绘图类时推荐使用该类。默认情况下,Graphics类使用的画笔属性是粗细为1个像素的正方形,而Graphics2D类可以调用setStroke()方法设置画笔的属性,如改变线条的粗细、虚实,定义线段端点的形状、风格等。

cynur的博客 1105

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

十九章总结 Java绘图

19.1.1 Graphics类Graphics 类是Java AWT(Abstract Window Toolkit)包中的一个重要类,用于在图形设备上绘制图形。它是一个抽象类,其实例通常由系统提供。Graphics 类提供了一系列方法,可以用于绘制文本、图像、形状等,并操作颜色、字体等图形属性。它是构建图形用户界面(GUI)的基础之一,常用于绘制图形界面的组件。19.1.2 Graphics2D类使用Graphics 类可以完成简单的图形绘制任务,但是它所实现的功能非常有限,如无法改变线条。

A3141950的博客 1201

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

第十九章 Java绘图

19.1 Java绘图类Graphics类Graphics 类是所有图形上下文的抽象基类,它允许应用程序在组件以及闭屏图像上进行绘制。Graphics 类封装了 Java 支持的基本绘图操作所需的状态信息,主要包括颜色、字体、画笔、文本、图像等。Graphics 类提供了绘图常用的方法,利用这些方法可以实现直线、矩形、多边形、椭圆、弧形等形状和文本、图形的绘制操作。另外,在执行操作之前,还可以使用相应的方法设置绘图的颜色和字体等状态属性。Graphics2D类。

SWEIYANG04的博客 463

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

​ 第十九章 java绘图

此方法总是用非缩放的图像来呈现缩放的矩形,并动态的执行所需的缩放,次操作不适用缓存缩放图像,执行图像从源到目标的缩放,将源矩形的第一个坐标映射到目标矩形的第一个坐标,源矩形的第二个坐标映射到目标矩形的第二个坐标,按需求缩放和反转子图像,以保持这些映射关系。Graphics类提供了绘图常用的方法,利用了这些方法可以实现,直线,矩形,多边形,椭圆,圆弧等,形状和文本,图片的绘制操作。另外,在执行这些操作之前,还可以使用相应的方法,设置绘图的颜色和字体等状态属性。

weixin_74767865的博客 481

第十九章——Java绘图

1.Graphics类是所以图形上下文的抽象基类,它允许应用程序在组件以及闭屏图像上进行绘制。2.Graphics类封装了Java支持的基本绘图操作所需的状态信息,主要包括颜色,字体,画笔,文本,图像等。

m0_74981829的博客 448

Java绘图【第十九章】

Graphics2D类是在继承 Graphics 类的基础上编写的,它包含了 Graphics 类的绘图方法并添加了更强的功能,在创建绘图类时推荐使用该类。Java 可以分别使用 Graphics 类和 Graphics2D 类绘制图形,Graphics 类使用不同的方法实现不同图形的绘制。默认情况下,Graphics类使用的画笔属性是粗细为1个像素的正方形,而 Graphics2D 类可以调用setStroke0方法设置画笔的属性,如改变线条的粗细、虚实,定义线段端点的形状、风格等。

qq_74860378的博客 284

第十九章 java绘图

此方法总是用非缩放的图像来呈现缩放的矩形,并动态的执行所需的缩放,次操作不适用缓存缩放图像,执行图像从源到目标的缩放,将源矩形的第一个坐标映射到目标矩形的第一个坐标,源矩形的第二个坐标映射到目标矩形的第二个坐标,按需求缩放和反转子图像,以保持这些映射关系。Graphics类提供了绘图常用的方法,利用了这些方法可以实现,直线,矩形,多边形,椭圆,圆弧等,形状和文本,图片的绘制操作。java语言使用Color类封装颜色的各种属性,并对颜色进行管理。另外,在绘制图形是,还可以只盯线的粗细,和叙事等画笔属性,

2201_75658999的博客 465
上一篇: JAVA范例 - Applet小应用程序
下一篇: JAVA范例 十九) 多媒体与图像处理 (二)
iMarsX
博客等级 码龄16年 3粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值