二○○九 ~二○一○ 学年第 二 学期
应用技术学院
课程设计报告书
课程名称: 多媒体技术
班 级: 09 级网络工程
学 号:
姓 名:
指导教师:
二○一○ 年 六 月
目录
1.需求分析.........................................................................................................................................2
课程设计题目......................................................................................................................2
课程设计要求......................................................................................................................2
系统功能需求分析..............................................................................................................2
2.概要设计.........................................................................................................................................3
3.详细设计.........................................................................................................................................4
界面设计..............................................................................................................................4
行程编码设计....................................................................................................................11
4.程序调试.......................................................................................................................................14
源文件的压缩....................................................................................................................14
源文件的解压....................................................................................................................15
5.总结...............................................................................................................................................18
1.需求分析
课程设计题目
信源与信道编/解码练习。
课程设计要求
1) 要求利用程序设计软件(如 VC、Java、Matlab)制作一个能完成信道编/解码(海
明/CRC 码),信源编/解码(如行程编码)软件。
2) 基本要求为编制软件至少能根据所输入的数据完成信源、信道编解码,其中
信道编码要求能产生 1-2 位随机错误,且能纠 1 位错,最后是能读取 txt 文
件,或者直接读取图片来完成,如能对视频完成则更佳。
3) 编写的软件编译后能直接运行,验证编/解码效果,否则无效。
系统功能需求分析
操作环境(软件、硬件及条件)
Windws 9x/NT/2000/XP/2003
NetBeans IDE
系统功能
此软件是在 JAVA 平台下编写的 ,能根据所输入的数据完成信道(海明
码)、信源编解码(行程编码),其中信道编码(海明码)能产生 1 位随机错误,
且能纠 1 位错,最后是能直接读取图片或 txt 文件来完成。
用户操作流程
编 码:
开始编码
校验
查看所存目标文件是否压缩成功
打开(选择源文件)
保存(选择目标文件)
解 码:
2.概要设计
系统总体框架:
开始解码
查看所存目标文件是否解压成功
保存(选择目标文件)
打开(选择已压缩的文件)
打开源文件
压 缩
检 错
纠 错
解 压
得到源文件
3.详细设计
本次课程设计中我主要负责界面设计和行程编码,故作以下详细介绍。
界面设计
界面设计如图 3-1 所示:
图 3-1
界面设计代码如下:
package DMTcode;
import ;
import ;
import ;
public class NewJFrame extends {
int rndChooser;
byte targetBit;
private int i;
File f1,f2;
byte[] mybyte1,mybyte2;
public NewJFrame() {
initComponents();
("重庆大学 09 网络工程 尹力 沈小波 多媒体课程设计");
}
@SuppressWarnings("unchecked");
private void initComponents() {
jPanel1 = new ();
jButton1 = new ();
jLabel1 = new ();
jTextField1 = new ();
jLabel2 = new ();
jTextField2 = new ();
jButton2 = new ();
jButton4 = new ();
jButton5 = new ();
jPanel2 = new ();
jLabel3 = new ();
jLabel4 = new ();
jPanel3 = new ();
jLabel5 = new ();
jLabel6 = new ();
jLabel7 = new ();
jLabel8 = new ();
jButton3 = new ();
jLabel9 = new ();
setDefaultCloseOperation(_ON_CLOSE);
(("行程编码文件"));
("打开");
(new () {
public void actionPerformed( evt) {
jButton1ActionPerformed(evt);
}
});
("源文件:");
(false);
("目标文件:");
(false);
("保存");
(new () {
public void actionPerformed( evt) {
jButton2ActionPerformed(evt);
}
});
("开始编码");
(new () {
public void actionPerformed( evt) {
jButton4ActionPerformed(evt);
}
});
("开始解码");
(new () {
public void actionPerformed( evt) {
jButton5ActionPerformed(evt);
}
});
jPanel1Layout = new (jPanel1);
(jPanel1Layout);
((.
)
.addGroup(()
.addGap(38, 38, 38)
.addGroup((
, false)
.addGroup(,
()
.addComponent(jLabel2)
.addPreferredGap(
ELATED)
.addComponent(jTextField2))
.addGroup(()
.addComponent(jLabel1)
.addPreferredGap(
ELATED)
.addComponent(jTextField1,
_SIZE, 174,
_SIZE)))
.addPreferredGap(,
103, _VALUE)
.addGroup((
)
.addComponent(jButton2)
.addComponent(jButton1))
.addGap(50, 50, 50)
.addGroup((
)
.addComponent(jButton5)
.addComponent(jButton4))
.addContainerGap(98, _VALUE))
);
(
()
.addGroup(()
.addGroup((
)
.addGroup(()
.addGap(17, 17, 17)
.addGroup((
)
.addComponent(jLabel1)
.addComponent(jTextField1,
_SIZE, _SIZE,
_SIZE))
.addGap(7, 7, 7)
.addGroup((
)
.addComponent(jLabel2)
.addComponent(jTextField2,
_SIZE, _SIZE,
_SIZE)))
.addGroup(()
.addContainerGap()
.addGroup((
)
.addComponent(jButton1)
.addComponent(jButton4))
.addPreferredGap(
ELATED)
.addGroup((
)
.addComponent(jButton5)
.addComponent(jButton2))))
.addContainerGap(11, _VALUE))
);
getContentPane().add(jPanel1, _START);
((" 文件信息"));
(new (442, 40));
("源文件大小:");
("目标文件大小:");
jPanel2Layout = new (jPanel2);
(jPanel2Layout);
((.
)
.addGroup(()
.addGap(29, 29, 29)
.addComponent(jLabel3)
.addPreferredGap(,
268, _VALUE)
.addComponent(jLabel4)
.addGap(200, 200, 200))
);
((
)
.addGroup(()
.addGroup((
)
.addComponent(jLabel3)
.addComponent(jLabel4))
.addContainerGap(17, _VALUE))
);
getContentPane().add(jPanel2, );
(("海明编码信息"));
("字节二进制编码:");
("字节海明编码:");
("随机出错:");
("校验");
(new () {
public void actionPerformed( evt) {
jButton3ActionPerformed(evt);
}
});
("纠正:");
jPanel3Layout = new (jPanel3);
(jPanel3Layout);
(
()
.addGroup(()
.addGap(26, 26, 26)
.addGroup((
)
.addGroup(()
.addComponent(jLabel7)
.addPreferredGap(
ELATED, 321, _VALUE)
.addComponent(jLabel9)
.addGap(186, 186, 186))
.addGroup(()
.addComponent(jLabel8)
.addPreferredGap(
ELATED, 278, _VALUE)
.addComponent(jButton3)
.addGap(232, 232, 232))
.addGroup(()
.addGroup((
)
.addComponent(jLabel6)
.addComponent(jLabel5))
.addContainerGap(531, _VALUE))))
);
(
()
.addGroup(()
.addContainerGap()
.addComponent(jLabel5)
.addPreferredGap(
)
.addComponent(jLabel6)
.addPreferredGap(
)
.addGroup((
)
.addComponent(jLabel7)
.addComponent(jLabel9))
.addPreferredGap(
)
.addGroup((
)
.addComponent(jLabel8)
.addComponent(jButton3))
.addContainerGap(_SIZE,
_VALUE))
);
getContentPane().add(jPanel3, );
pack();
}// </editor-fold>
private void jButton1ActionPerformed( evt) {
// TODO add your handling code here:
JFileChooser chooser=new JFileChooser();
(jLabel1);
(().getPath().toString());
("源文件大小:"+().length()+"字节");
f1=();
}
private void jButton2ActionPerformed( evt) {
// TODO add your handling code here:
JFileChooser chooser1=new JFileChooser();
(jLabel1);
f2=();
(().getPath().toString());
("目标文件大小:"+().length()+"字节");
}
private void jButton3ActionPerformed( evt) {
("随机出错:"+()[0]);
("纠正:"+()[1]);
}
private void jButton4ActionPerformed( evt) {
// TODO add your handling code here:
/*调用编码方法开始压缩文件*/
if(()==null&&()==null){
(null, "还没有设置文件呢!");
}else{
try{
mybyte1=(f1);
mybyte2=(mybyte1);
(f2, mybyte2);
("目标文件大小:"+()+"字节");
rndChooser=(int)(()*);
targetBit=mybyte2[rndChooser];
("字节值:"+(targetBit));
("字节二进制编码:"+(targetBit)[0]);
("字节海明编码:"+(targetBit)[1]);
}catch(Exception e){}
}
}
private void jButton5ActionPerformed( evt) {
/*调用解码码方法开始解压文件*/
if(()==null&&()==null){
(null, "还没有设置文件呢!");
}else{
try{
mybyte1=(f1);
mybyte2=(mybyte1);
(f2, mybyte2);
("目标文件大小:"+()+"字节");
rndChooser=(int)(()*);
targetBit=mybyte2[rndChooser];
("字节值:"+(targetBit));
("字节二进制编码:"+(targetBit)[0]);
("字节海明编码:"+(targetBit)[1]);
}catch(Exception e){}
}
}
public static void main(String args[]) {
(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
private jButton1;
private jButton2;
private jButton3;
private jButton4;
private jButton5;
private jLabel1;
private jLabel2;
private jLabel3;
private jLabel4;
private jLabel5;
private jLabel6;
private jLabel7;
private jLabel8;
private jLabel9;
private jPanel1;
private jPanel2;
private jPanel3;
private jTextField1;
private jTextField2;
}
行程编码设计
由界面中的开始解码调用行程编码的函数,其代码如下:
public static byte[] zipCode(byte[] mycode){
byte[] tempArray=new byte[10000000];//构建一个足够大的临时数组;
int[] lengthArray=new int[4];//临时的存位数长度的数组
lengthArray[0]=-127;
int i=1;
int n=0;
int mycount=1;
do{
if(mycode[i]==mycode[i-1]){
mycount++;
i++;
}else{
tempArray[n]=mycode[i-1];
n++;
if(mycount>127){
tempArray[n]=(byte)lengthArray[0];
n++;
if((lengthArray[1]=mycount/127)>127){
lengthArray[2]=lengthArray[1]/127;
lengthArray[1]=127;
tempArray[n]=(byte)lengthArray[1];
n++;
tempArray[n]=(byte)lengthArray[2];
}else{
tempArray[n]=(byte)lengthArray[1];
n++;
tempArray[n]=0;
}
n++;
lengthArray[3]=mycount%127;
tempArray[n]=(byte)lengthArray[3];
}else{
tempArray[n]=(byte)mycount;
}
mycount=1;
n++;
i++;
}
}while(i<);
if(i==){
tempArray[n]=mycode[i-1];
n++;
if(mycount>127){
tempArray[n]=(byte)lengthArray[0];
n++;
if((lengthArray[1]=mycount/127)>127){
lengthArray[2]=lengthArray[1]/127;
lengthArray[1]=127;
tempArray[n]=(byte)lengthArray[1];
n++;
tempArray[n]=(byte)lengthArray[2];
}else{
tempArray[n]=(byte)lengthArray[1];
n++;
tempArray[n]=0;
}
n++;
lengthArray[3]=mycount%127;
tempArray[n]=(byte)lengthArray[3];
}else{
tempArray[n]=(byte)mycount;
}
}
byte[] result=new byte[n+1];//定义一个新数组,存放压缩后实际大小的图像文件
for(int count=0;count<;count++){
result[count]=tempArray[count];
}
("目前的字节是 :"+);
return result;
}
public static byte[] unzipCode(byte[] myrecode){
byte[] tempArray=new byte[10000000];
int lengthBit;
int n=0;
for(int i=0;i<;){
if(myrecode[i+1]==-127){
if(myrecode[i+3]==0) myrecode[i+3]=1;
lengthBit=myrecode[i+2]*myrecode[i+3]*127+myrecode[i+4];
for(int l=0;l<lengthBit;l++){
tempArray[n]=myrecode[i];
n++;
}
i+=5;
}else{
for(int m=0;m<myrecode[i+1];m++){
tempArray[n]=myrecode[i];
n++;
}
i+=2;
}
}
byte[] result=new byte[n+1];//定义一个新数组,存放压缩后实际大小的图像文件
for(int count=0;count<;count++){
result[count]=tempArray[count];
}
("解压后目前的字节是 :"+);
(null, "解压成功!");
return result;
}
4.程序调试
我做的行程编码,只对其做了调试。
程序调试步骤如下:
源文件的压缩
首先点击界面中的打开按钮,选择 图片,点击打开;如图 4-1 所示:
图 4-1
选择打开,然后点击界面保存按钮,在文件名中输入 321,点击保存;如图 4-2
所示:
图 4-2
点击界面的开始编码按钮;出现如图 4-3 所示:
图 4-3
点击确定;出现如图 4-4 所示:
图 4-4
由文件的字节大小可以确定图片的压缩过程已经完成。
源文件的解压
点击界面的打开按钮,打开文件名为 321 的文件;如图 4-5 所示:
图 4-5
点击打开,再点击界面的保存按钮,输入 ;如图 4-6 所示:
图 4-6
点击保存,如图 4-7;点击界面的开始解码按钮,出现如图 4-8 所示:
图 4-7
图 4-8
由此解压过程结束。
如图 4-9 所示,可知压缩文件 321,解压文件 132,和源文件 123 的属性,从而可
知设计成功,调试完成。
图 4-9
5.总结
通过本次多媒体课程设计,我深入学习了使用 Java 来设计程序界面,并且
学会了调用行程编码函数。在设计的过程中遇到了不少问题,其中最难解决的问
题就是在调用行程编码时,对 Java 掌握不熟悉,出现了链接问题,通过对程序
的调试以及同组伙伴的帮助,发现了问题的所在,从而解决了问题;最后在老师
的帮助和同组伙伴的同心协力下,我们顺利的完成了课程设计的内容,我在此由
衷的感谢老师和同组的伙伴。