老师让做一个游戏项目,需要用到很多图片的操作.
自己做了一个图片工具类,运行时正常,但关闭窗口的时候出异常(此类继承自JFrame)
Corrupt JPEG data: 20 extraneous bytes before er 0xd4
弄了很久也不行,Google上也没有搜索到答案.望各位大侠帮个忙.我也只有20分可以奉上了..谢谢了..
部分代码如下:package com.lovo.smallpig.util;import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageProducer;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.JFrame;/**
 * 音乐工具类
 */
public class CutImage extends JFrame {
/**
 * --------------------- 属性区 ---------------------
 */ /** 启动背景图片 */
private Image startBk; /** 游戏主界面背景图片 */
private Image mainBk; /** 登陆时的背景图片 */
private Image loginBK; /** 子弹图片 */
private Image bulletImage; /** 降落伞图片 */
private Image balloonImage; /** 绳子图片 */
private Image cordImage; /** 猪图片数组 */
private Image[] pigImage; /** 启动时的小猪文字图片数组 */
private Image[] pigNumber; /** 启动下边的不断变大的字体 */
private Image pigFont; /** 狼图片数组 */
private Image[] wolfImages; /** 轮子图片数组 */
private Image[] gearImages; /** 气球图片数组 */
private Image[] ballImages; /** 道具图片数组 */
private Image[] itemsImages; /** 登陆时的选择项 */
private Image[] menuImages; /** 媒体追踪器 */
private MediaTracker MT; /** 缓冲区 */
private Image bufImage; /** 缓冲区画笔 */
private Graphics bufGraphics; /**
 * --------------------- 构造区 ---------------------
 */ public CutImage() {
// 设置窗口
this.setLayout(null);
// 窗口居中。
this.setBounds(100, 100, 800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /** 启动背景图片 */
startBk = loadImage("back.JPG");
/** 登陆时的背景图片 */
loginBK = loadImage("login.jpg");
/** 游戏主界面背景图片 */
mainBk = loadImage("background.jpg"); /** 子弹图片 */
bulletImage = loadImage("bullet.gif");
/** 降落伞图片 */
balloonImage = loadImage("balloon.gif");
/** 绳子图片 */
cordImage = loadImage("cord.gif"); /** 猪图片数组 */
pigImage = cutImage("pig.gif", 10, 1000 / 10, 83, 0);
/** 狼图片数组 */
wolfImages = cutImage("wolf.gif", 14, 875 / 7, 250 / 2, 0);
/** 轮子图片数组 */
gearImages = cutImage("gear.gif", 10, 206 / 2, 59, 0);
/** 气球图片数组 */
ballImages = cutImage("ball.gif", 10, 400 / 4, 80, 0);
/** 道具图片数组 */
//  itemsImages = cutImage("items.gif",10,1000 / 10,83,0);
/** 登陆时的选择项 */
menuImages = cutImage("menu.gif", 8, 200, 800 / 8, 0); /** pig 1~5(主界面上边 片头动画) */
pigNumber = new Image[5];
pigNumber[0] = loadImage("pig1.gif");
pigNumber[1] = loadImage("pig2.gif");
pigNumber[2] = loadImage("pig3.gif");
pigNumber[3] = loadImage("pig4.gif");
pigNumber[4] = loadImage("pig5.gif"); /** 启动下边的不断变大的字体 */ pigFont = loadImage("1.gif");// this.setVisible(true); // 创建图形缓冲区
// bufImage = this.createImage(this.getWidth(), this.getHeight());// 缓冲区
// 取得缓冲区画笔
// bufGraphics = bufImage.getGraphics(); } /**
 * --------------------- GET方法区 ---------------------
 */ /** 气球图片数组 */
public Image[] getBallImage() {
return ballImages;
} /** 降落伞图片 */
public Image getBalloonImage() {
return balloonImage;
} /** 启动时背景图片 */
public Image getStartBk() {
return startBk;
} /** 登陆时的背景图片 */
public Image getLoginBK() {
return loginBK;
} /** 游戏主界面背景图片 */
public Image getMainBk() {
return mainBk;
} /** 子弹图片 */
public Image getBulletImage() {
return bulletImage;
} /** 绳子图片 */
public Image getCordImage() {
return cordImage;
} /** 轮子图片数组 */
public Image[] getGearImages() {
return gearImages;
} /** 道具图片数组 */
public Image[] getItemsImages() {
return itemsImages;
} /** 媒体追踪器 */
public MediaTracker getMT() {
return MT;
} /** 猪图片数组 */
public Image[] getPigImages() {
return pigImage;
} /** 启动时的小猪文字图片数组 */
public Image[] getPigNumbers() {
return pigNumber;
} /** 启动下边的不断变大的字体 */
public Image getPigFont() {
return pigFont;
} /** 狼图片数组 */
public Image[] getWolfImages() {
return wolfImages;
} /** 登陆时的选择项 */
public Image[] getMenuImages() {
return menuImages;
} public Image getBufImage() {
return bufImage;
}

/**
 * --------------------- 处理方法区 ---------------------
 */ /** 在缓冲区中画图 */
public void drawImage(Image image, int x, int y) {
bufGraphics.drawImage(image, x, y, image.getWidth(null), image
.getHeight(null), null);
}

public void drawImage(Image image,int x,int y,int width,int height){
bufGraphics.drawImage(image, x, y, width, height, null);
} /** 在屏幕上画图,该方法被系统调用 */
public void paint(Graphics g) {
// super.paint(g);
g.drawImage(bufImage, 0, 0, this.getWidth(), this.getHeight(), null);
} /** 取得图片所在的绝对路径 */
private static URL getRootURL(String fileName) {
URL url = null;
StringBuffer sb = new StringBuffer(Music.class.getResource("/")
.toString());
sb.delete(sb.length() - 4, sb.length());
sb.append("/img/");
sb.append(fileName); try {
url = new URL(sb.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
return url;
} /** 图片文件处理 */
public Image loadImage(String fileName) { /** 传入类的绝对路径,和图片名称 */
Image img = Toolkit.getDefaultToolkit().getImage(getRootURL(fileName)); // 其次,创建媒体跟踪器,并将图片加载入媒体跟踪器
MT = new MediaTracker(this);
MT.addImage(img, 0);
// 再次,等待媒体跟踪器将所有图片加载完毕
try {
MT.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
return img;
} /**
 * 抽取图片 从已有image中取出一部份
 * 
 * @param image
 *            需要处理的图片
 * @param x
 *            横坐标
 * @param y
 *            纵坐标
 * @param width
 *            切割图片宽度
 * @param height
 *            切割图片高度
 * @return 图片
 */
private Image getPartImage(Image image, int x, int y, int width, int height) {
ImageProducer ip = image.getSource();
return createImage(new FilteredImageSource(ip, new CropImageFilter(x,
y, width, height)));
} /**
 * 分割图片 将已有image按行列切割成多个小image,返回image数组
 * 
 * @param image
 *            需要处理的图片
 * @param rows
 *            行数
 * @param cols
 *            列数
 * @param cutWidth
 *            宽度
 * @param cutHeight
 *            高度
 * @param borderWidth
 *            框高
 * @return 图片数组
 */
private Image[] cutImage(Image image, int rows, int cols, int cutWidth,
int cutHeight, int borderWidth) {
Image[] cutImg = new Image[rows * cols];
int k = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) { cutImg[k] = getPartImage(image, j * cutWidth, i * cutHeight,
cutWidth, cutHeight - 10);
k++;
System.out.println(j);
}
}
return cutImg;
}}