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

Bu Sayfayı Paylaş:




Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir