ImageCapturer.java
Dosyayı İndir
package javafxtest;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.ImageOutputStream;
public class ImageCapturer {
private String imagePath = "D:\\Research\\JavaFx\\SampleOutputAnimated.gif";
private Robot robot;
private ImageWriter writer;
private IIOMetadata metadata;
private ImageWriteParam param;
private boolean capturing;
private int timeBetweenFrames;
private int delayTime = 10;
public ImageCapturer() {
try {
robot = new Robot();
} catch (Exception e) {
e.printStackTrace();
}
}
public int getTimeBetweenFrames() {
return timeBetweenFrames;
}
public void setTimeBetweenFrames(int timeBetweenFrames) {
this.timeBetweenFrames = timeBetweenFrames;
//delayTime=timeBetweenFrames/10;
}
public void capture(int x, int y, int width, int height) {
try {
Rectangle rectangle = new Rectangle(x, y, width, height);
BufferedImage image = robot.createScreenCapture(rectangle);
File file = new File(imagePath);
ImageIO.write(image, "gif", file);
} catch (Exception e) {
e.printStackTrace();
}
}
public void capturePrepare() {
try {
if(capturing){
return;
}
writer = getWriter();
ImageOutputStream output = ImageIO.createImageOutputStream(new File(imagePath));
writer.setOutput(output);
writer.prepareWriteSequence(metadata);
capturing = true;
System.out.println("PREPARED");
} catch (Exception e) {
e.printStackTrace();
}
}
private void checkMetadata(BufferedImage image) {
if (metadata == null) {
try {
param = writer.getDefaultWriteParam();
ImageTypeSpecifier specifier = new ImageTypeSpecifier(image);
metadata = writer.getDefaultImageMetadata(specifier, param);
setAttributes(metadata);
writer.prepareWriteSequence(metadata);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void captureSequence(int x, int y, int width, int height) {
try {
Rectangle rectangle = new Rectangle(x, y, width, height);
BufferedImage image = robot.createScreenCapture(rectangle);
checkMetadata(image);
IIOImage img = new IIOImage(image, null, metadata);
writer.writeToSequence(img, param);
System.out.println("SEQUENCED");
} catch (Exception e) {
e.printStackTrace();
}
}
public void captureEnd() {
try {
if(capturing){
writer.endWriteSequence();
capturing = false;
}
System.out.println("ENDED");
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean isCapturing() {
return capturing;
}
public void setCapturing(boolean capturing) {
this.capturing = capturing;
}
// void doIt(){
// BufferedImage offScreenImage = null;
//
// ImageWriter gifWriter = getWriter(offScreenImage);
// ImageWriteParam imageWriteParam = gifWriter.getDefaultWriteParam();
// ImageTypeSpecifier imageTypeSpecifier = new ImageTypeSpecifier(offScreenImage);
//
// IIOMetadata imageMetaData =gifWriter.getDefaultImageMetadata(imageTypeSpecifier,imageWriteParam);
//
// String metaFormatName = imageMetaData.getNativeMetadataFormatName();
//
// IIOMetadataNode root = (IIOMetadataNode)imageMetaData.getAsTree(metaFormatName);
//
// IIOMetadataNode graphicsControlExtensionNode = getNode(root,"GraphicControlExtension");
//
// graphicsControlExtensionNode.setAttribute("disposalMethod", "none");
// graphicsControlExtensionNode.setAttribute("userInputFlag", "FALSE");
// graphicsControlExtensionNode.setAttribute("transparentColorFlag","FALSE");
// graphicsControlExtensionNode.setAttribute("delayTime",Integer.toString(timeBetweenFramesMS / 10));
// graphicsControlExtensionNode.setAttribute("transparentColorIndex","0");
//
// IIOMetadataNode commentsNode = getNode(root, "CommentExtensions");
// commentsNode.setAttribute("CommentExtension", "Created by MAH");
//
// IIOMetadataNode appEntensionsNode = getNode(root,"ApplicationExtensions");
// IIOMetadataNode child = new IIOMetadataNode("ApplicationExtension");
//
// child.setAttribute("applicationID", "NETSCAPE");
// child.setAttribute("authenticationCode", "2.0");
// boolean loopContinuously=true;
// int loop = loopContinuously ? 0 : 1;
//
// child.setUserObject(new byte[]{ 0x1, (byte) (loop & 0xFF), (byte)
//((loop >> 8) & 0xFF)});
// appEntensionsNode.appendChild(child);
//
// imageMetaData.setFromTree(metaFormatName, root);
//
// outputStream =ScreenShotWriterThread.getOutputStream(frame, gifWriter,suggestedFileName);
//
// gifWriter.setOutput(outputStream);
//
// Graphics offScreenGraphics = offScreenImage.createGraphics();
//
// gifWriter.prepareWriteSequence(null);
//
// for (int i = 0; i < nFrames; i++) {
// // Draw into the BufferedImage, and then do
// gifWriter.writeToSequence(new IIOImage(offScreenImage, null,
//imageMetaData),
// imageWriteParam);
//
// }
// gifWriter.endWriteSequence();
//
//
private void setAttributes(IIOMetadata metadata) {
try {
IIOMetadataNode root = (IIOMetadataNode) metadata.getAsTree(metadata.getNativeMetadataFormatName());
IIOMetadataNode graphicsControlExtensionNode = getNode(root, "GraphicControlExtension");
graphicsControlExtensionNode.setAttribute("disposalMethod", "none");
graphicsControlExtensionNode.setAttribute("userInputFlag", "FALSE");
graphicsControlExtensionNode.setAttribute("transparentColorFlag", "FALSE");
graphicsControlExtensionNode.setAttribute("delayTime", Integer.toString(delayTime));
graphicsControlExtensionNode.setAttribute("transparentColorIndex", "0");
IIOMetadataNode commentsNode = getNode(root, "CommentExtensions");
commentsNode.setAttribute("CommentExtension", "Created by MAH");
IIOMetadataNode appEntensionsNode = getNode(root, "ApplicationExtensions");
IIOMetadataNode child = new IIOMetadataNode("ApplicationExtension");
child.setAttribute("applicationID", "NETSCAPE");
child.setAttribute("authenticationCode", "2.0");
boolean loopContinuously = true;
int loop = loopContinuously ? 0 : 1;
child.setUserObject(new byte[]{0x1, (byte) (loop & 0xFF), (byte) ((loop >> 8) & 0xFF)});
appEntensionsNode.appendChild(child);
metadata.setFromTree(metadata.getNativeMetadataFormatName(), root);
} catch (Exception e) {
e.printStackTrace();
}
}
private static IIOMetadataNode getNode(IIOMetadataNode rootNode, String nodeName) {
int nNodes = rootNode.getLength();
for (int i = 0; i < nNodes; i++) {
if (rootNode.item(i).getNodeName().compareToIgnoreCase(nodeName) == 0) {
return ((IIOMetadataNode) rootNode.item(i));
}
}
IIOMetadataNode node = new IIOMetadataNode(nodeName);
rootNode.appendChild(node);
return (node);
}
private ImageWriter getWriter() {
Iterator<ImageWriter> i = ImageIO.getImageWritersByFormatName("gif");
ImageWriter w = null;
while (i.hasNext()) {
w = i.next();
break;
}
return w;
}
}
Dosyayı İndir