import java.util.*; import java.text.SimpleDateFormat; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.io.File; import javax.imageio.ImageIO; import quicktime.*; import quicktime.util.*; import quicktime.util.QTUtils; import quicktime.io.*; import quicktime.qd.*; import quicktime.std.StdQTConstants; import quicktime.std.sg.*; import quicktime.std.image.*; import quicktime.std.movies.*; import quicktime.std.qtcomponents.*; import quicktime.app.view.*; public class AirEyeCommand extends Frame implements StdQTConstants, Runnable, Errors { private SGVideoChannel mVideo; private SequenceGrabber mGrabber; private Thread t; private boolean recording = false; private boolean tStop = false; private int[] pixelData = null; private BufferedImage image =null; private MyComp ret =null; private Frame myFrame = null; private QDRect cameraImageSize = null; private QDGraphics gWorld = null; class MyComp extends Component{ public void paint(Graphics g){ super.paint(g); g.drawImage(image, 0, 0, this); }; public void saveImage() { boolean result = false; try { result = ImageIO.write(image, "jpeg", new File(makeFileName())); } catch (Exception e) { e.printStackTrace(); result = false; } } }; public static void main (String args[]) { AirEyeCommand sr = new AirEyeCommand ("AirEyeCommand"); sr.setVisible(true); sr.toFront(); } void createSGObject() throws QTException { mGrabber = new SequenceGrabber(); mVideo = new SGVideoChannel(mGrabber); cameraImageSize = new QDRect(640, 480); gWorld=new QDGraphics(cameraImageSize); mGrabber.setGWorld(gWorld, null); mVideo.setBounds(cameraImageSize); mVideo.setUsage(quicktime.std.StdQTConstants.seqGrabRecord); mVideo.setFrameRate(0); mVideo.setCompressorType(quicktime.std.StdQTConstants.kComponentVideoCodecType); // Setting up the buffered image int size = gWorld.getPixMap().getPixelData().getSize(); int intsPerRow = gWorld.getPixMap().getPixelData ().getRowBytes()/4; size = intsPerRow*cameraImageSize.getHeight(); pixelData = new int[size]; DataBuffer db = new DataBufferInt(pixelData, size); ColorModel colorModel = new DirectColorModel(32, 0x00ff0000, 0x0000ff00, 0x000000ff); int[] masks= {0x00ff0000, 0x0000ff00, 0x000000ff}; WritableRaster raster = Raster.createPackedRaster(db, cameraImageSize.getWidth(), cameraImageSize.getHeight(), intsPerRow, masks, null); image = new BufferedImage (colorModel, raster, false, null); // Setting up a component, capable of displaying the image ret = new MyComp(); myFrame = new Frame("Test"); myFrame.setBounds(100, 100, cameraImageSize.getWidth(), cameraImageSize.getHeight()); myFrame.add(ret); myFrame.setVisible(true); //Defining the data procedure which pushes the data into the image SGDataProc myDataProc = new SGDataProc(){ DSequence ds = null; final Matrix idMatrix=new Matrix(); byte[] rawData = new byte[ QTImage.getMaxCompressionSize( gWorld, gWorld.getBounds(), 0, quicktime.std.StdQTConstants.codecLowQuality, quicktime.std.StdQTConstants.kComponentVideoCodecType, CodecComponent.anyCodec) ]; RawEncodedImage ri = null; public int execute(SGChannel chan, QTPointerRef dataToWrite, int offset, int chRefCon, int time, int writeType){ if (chan instanceof SGVideoChannel) try{ ImageDescription id = mVideo.getImageDescription (); if(rawData==null) rawData = new byte [dataToWrite.getSize()]; RawEncodedImage ri = new RawEncodedImage (rawData); dataToWrite.copyToArray(0, rawData, 0, dataToWrite.getSize()); if(ds==null){ ds = new DSequence(id, ri, gWorld, cameraImageSize, idMatrix, null, 0, quicktime.std.StdQTConstants.codecNormalQuality, CodecComponent.anyCodec); }else{ ds.decompressFrameS(ri, quicktime.std.StdQTConstants.codecNormalQuality); } gWorld.getPixMap().getPixelData ().copyToArray(0, pixelData, 0, pixelData.length); ret.repaint(); return 0; }catch(Exception ex){ ex.printStackTrace(); return 1; } else return 1; } }; mGrabber.setDataProc(myDataProc); t = new Thread (this,"SoundRecord Idle Method"); mGrabber.setDataOutput (null, seqGrabDontMakeMovie); mGrabber.prepare(true, true); mGrabber.startRecord(); t.start(); recording = true; } AirEyeCommand (String title) { super (title); try { QTSession.open(); System.out.println ("Make sure you have connected an Input device or have a built in audio input device."); createSGObject(); } catch (Exception ee) { ee.printStackTrace(); QTSession.close(); } try { if (mGrabber == null) createSGObject(); } catch (Exception ee) { ee.printStackTrace(); QTSession.close(); } addNotify(); Insets insets = getInsets(); setBounds (0, 0, (insets.left + insets.right + 220), (insets.top + insets.bottom + 16)); addWindowListener (new WindowAdapter () { public void windowClosing (WindowEvent e) { try { if (mGrabber != null) mGrabber.stop(); //stop preview if (recording) tStop = true; if (mVideo != null) mGrabber.disposeChannel (mVideo); } catch (QTException ee) { ee.printStackTrace(); } QTSession.close(); dispose(); } public void windowClosed (WindowEvent e) { System.exit(0); } }); } public void run () { try { // とりあえず待ってみる Thread.sleep(1*1000); for(int i=0; i< 3; i++) { for (;;) { mGrabber.idleMore(); mGrabber.update(null); Thread.sleep(1*1000); break; } } } catch (Exception e) { e.printStackTrace(); } // キャプチャーした画像を保存する。 ret.saveImage(); // 終了処理 try { if (mGrabber != null) mGrabber.stop(); //stop preview if (recording) tStop = true; if (mVideo != null) mGrabber.disposeChannel (mVideo); mGrabber.release(); mGrabber = null; } catch (QTException ee) { ee.printStackTrace(); } QTSession.close(); dispose(); System.exit(0); } private String makeFileName() { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String fileName = null; Calendar datNow = Calendar.getInstance(); fileName = "AirEyeCommand_"+sdf.format(new Date()); return fileName; } }