特别感谢monitor兄台的技术援助!
monitor兄台CSDN的博客地址:http://hi.csdn.net/space-3386597.html
monitor兄台于此相关的博文地址(标题:Java循环播放图片问题):http://blog.csdn.net/monitor1394/archive/2010/12/23/6093765.aspx
录制代码
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
class ImagesCapture {
private String fileName; // 文件的前缀
private String defaultName = "GuiCamera";
static int serialNum = 0;
private String imageFormat; // 图像文件的格式
private String defaultImageFormat = "png";
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
public ImagesCapture() {
fileName = defaultName;
imageFormat = defaultImageFormat;
}
public ImagesCapture(String s, String format) {
fileName = s;
imageFormat = format;
}
public void snapShot() {
try {
// 拷贝屏幕到一个BufferedImage对象screenshot
BufferedImage screenshot = (new Robot())
.createScreenCapture(new Rectangle(0, 0,
(int) d.getWidth(), (int) d.getHeight()));
serialNum++;
// 根据文件前缀变量和文件格式变量,自动生成文件名
String name = fileName + String.valueOf(serialNum) + "."
+ imageFormat;
// 如果仅有文件名的话,默认存到项目的根目录下!
File f = new File(name);
System.out.print("Save File " + name);
// 将screenshot对象写入图像文件
ImageIO.write(screenshot, imageFormat, f);
System.out.print("..Finished! ");
} catch (Exception ex) {
System.out.println(ex);
}
}
public static void main(String[] args) {
ImagesCapture cam = new ImagesCapture("Test", "JPG");
// cam.snapShot();
while(true) {
cam.snapShot();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
播放代码
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
// 这个程序不行,需要调整JVM内存的大小,-Xmx512M 才够支持初始化时加载120张左右的截图!
// 而且行能很不稳定,垃圾收集器一工作起来不仅该程序而且整机都慢如蜗牛(-Xmx1024M情况下)
// 进一步拓展,依据MP4的原理对图片进行压缩!制作进度条、暂停和启动,GUI化!
public class ImagePlayer extends Frame {
private static final long serialVersionUID = 8055029906280922502L;
// 从1到270共270张图片
// private static final int COUNT = 270;
private static final int COUNT = 179;
public ImagePlayer() {
this.setSize(1024, 768);
this.setLocation(50, 50);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(1);
}
});
DisplayJPanel djp = new DisplayJPanel(ImagePlayer.COUNT);
djp.setDelay(100); // 缺省为50
djp.setWork(true);
this.add(djp);
new Thread(djp).start();
this.setVisible(true);
}
public static void main(String[] args) {
new ImagePlayer();
}
}
class DisplayJPanel extends JPanel implements Runnable {
private static final long serialVersionUID = 7881859204259181796L;
/** 背景颜色 */
private final Color B_COLOR = Color.LIGHT_GRAY;
/** 起始X坐标 */
private final int WORK_X = -150;
/** 起始Y坐标 */
private final int WORK_Y = -70;
/** 当前要画的图片 */
private BufferedImage currentImage = null;
/** 播放延时 */
private int delay = 50;
/** 是否播放 */
private boolean work = true;
/** 是否暂停 */
private boolean stop = false;
private int frameNumber = 0;
private int frameCount;
public DisplayJPanel(int frameCount) {
this.frameCount = frameCount;
}
public void run() {
while (work) {
if (stop) {
sleep(1000);
continue;
}
repaint();
sleep(delay);
}
}
@Override
public void paintComponent(Graphics g) {
g.setColor(B_COLOR);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
if(frameNumber < frameCount) {
// ①
// String picPath = "D://Program Files//eclipse3.3//workspace//" +
// "PictureVideoPlayer//src//jpgImages//Test" + (frameNumber + 1) + ".JPG";
// ②
// String picPath = "src/jpgImages/Test" + (frameNumber + 1) + ".JPG";
// ③
String picPath = "jpgImages2/Test" + (frameNumber + 1) + ".JPG";
InputStream is = ImagePlayer.class.getClassLoader().getResourceAsStream(picPath);
frameNumber ++;
try {
// currentImage = ImageIO.read(new FileInputStream(picPath));
currentImage = ImageIO.read(is);
} catch (Exception e) {
System.out.println("加载图片时出现错误,程序即将退出!");
System.exit(1);
}
g.drawImage(currentImage, WORK_X, WORK_Y, null);
} else {
frameNumber = 0;
}
}
private void sleep(int s) {
try {
Thread.sleep(s);
} catch (Exception e) {
}
}
public void setDelay(int delay) {
this.delay = delay;
}
public void setWork(boolean work) {
this.work = work;
}
public void setStop(boolean stop) {
this.stop = stop;
}
}