/** * Creates a stream and corresponding live view image. Don't forget to call {@link * CanonUtils#release(edsdk.bindings.EdSdkLibrary.EdsBaseRef.ByReference...) release()} on the * returned array when you are done using it or you will cause a memory leak! * * @param camera the camera to query * @return EdsEvfImageRef.ByReference and EdsStreamRef.ByReference as indexes 0 and 1 respectively */ public static EdsBaseRef.ByReference[] getLiveViewImageReference(final EdsCameraRef camera) { EdsError err = EdsError.EDS_ERR_OK; final EdsStreamRef.ByReference streamRef = new EdsStreamRef.ByReference(); final EdsEvfImageRef.ByReference imageRef = new EdsEvfImageRef.ByReference(); // Create memory stream. err = CanonUtils.toEdsError( CanonCamera.EDSDK.EdsCreateMemoryStream(new NativeLong(0), streamRef)); if (err != EdsError.EDS_ERR_OK) { System.err.println( "Failed to download live view image, memory stream could not be created (error " + err.value() + ": " + err.name() + " - " + err.description() + ")"); CanonUtils.release(imageRef, streamRef); return null; } err = CanonUtils.toEdsError( CanonCamera.EDSDK.EdsCreateEvfImageRef( new EdsStreamRef(streamRef.getPointer().getPointer(0)), imageRef)); if (err != EdsError.EDS_ERR_OK) { System.err.println( "Failed to download live view image, image ref could not be created (error " + err.value() + ": " + err.name() + " - " + err.description() + ")"); CanonUtils.release(imageRef, streamRef); return null; } // Now try to follow the guidelines from // http://tech.groups.yahoo.com/group/CanonSDK/message/1225 // instead of what the edsdk example has to offer! // Download live view image data. err = CanonUtils.toEdsError(CanonCamera.EDSDK.EdsDownloadEvfImage(camera, imageRef.getValue())); if (err != EdsError.EDS_ERR_OK) { /* * System.err.println( "Failed to download live view image (error " * + * err.value() + ": " + err.name() + " - " + * err.description() + ")" ); */ CanonUtils.release(imageRef, streamRef); return null; } return new EdsBaseRef.ByReference[] {imageRef, streamRef}; }
/** * Downloads an image and saves it somewhere. * * @param directoryItem The item you want to download * @param destination A path in the filesystem where you want to save the file. Can also be null * or a directory. In case of null the temp directory will be used, in case of a directory the * file name of the item will be used. * @param appendFileExtension Adds the extension of the photo onto File to ensure that supplied * File name extension matches the image being downloaded from the camera. This is especially * important if the camera is set to RAW+JPEG where the order of the images is not consistent. * @return Either null, or the location the file was ultimately saved to on success. */ public static File download( final EdsDirectoryItemRef directoryItem, File destination, final boolean appendFileExtension) { EdsError err = EdsError.EDS_ERR_OK; final EdsStreamRef.ByReference stream = new EdsStreamRef.ByReference(); final EdsDirectoryItemInfo dirItemInfo = new EdsDirectoryItemInfo(); boolean success = false; // final long timeStart = System.currentTimeMillis(); try { err = CanonUtils.toEdsError( CanonCamera.EDSDK.EdsGetDirectoryItemInfo(directoryItem, dirItemInfo)); if (err == EdsError.EDS_ERR_OK) { if (destination == null) { destination = new File(System.getProperty("java.io.tmpdir")); } if (destination.isDirectory()) { destination = new File(destination, Native.toString(dirItemInfo.szFileName)); } else if (appendFileExtension) { final String sourceFileName = Native.toString(dirItemInfo.szFileName); final int i = sourceFileName.lastIndexOf("."); if (i > 0) { final String extension = sourceFileName.substring(i); if (!destination.getName().toLowerCase().endsWith(extension)) { destination = new File(destination.getPath() + extension); } } } if (destination.getParentFile() != null) { destination.getParentFile().mkdirs(); } /* * System.out.println( "Downloading image " + * Native.toString( dirItemInfo.szFileName ) + * " to " + destination.getCanonicalPath() ); */ // TODO: see if using an EdsCreateMemoryStream would be faster and whether the image could // be read directly without saving to file first - see: // http://stackoverflow.com/questions/1083446/canon-edsdk-memorystream-image err = CanonUtils.toEdsError( CanonCamera.EDSDK.EdsCreateFileStream( Native.toByteArray(destination.getCanonicalPath()), EdsFileCreateDisposition.kEdsFileCreateDisposition_CreateAlways.value(), EdsAccess.kEdsAccess_ReadWrite.value(), stream)); } if (err == EdsError.EDS_ERR_OK) { err = CanonUtils.toEdsError( CanonCamera.EDSDK.EdsDownload(directoryItem, dirItemInfo.size, stream.getValue())); } if (err == EdsError.EDS_ERR_OK) { /* * System.out.println( "Image downloaded in " + * ( System.currentTimeMillis() - timeStart ) + * " ms" ); */ err = CanonUtils.toEdsError(CanonCamera.EDSDK.EdsDownloadComplete(directoryItem)); success = true; } if (stream != null) { CanonCamera.EDSDK.EdsRelease(stream.getValue()); } } catch (final Exception e) { e.printStackTrace(); } return success ? destination : null; }
/** * Download a live view image from the camera and convert it directly into a bufferd image. * * @param camera * @return */ public static BufferedImage getLiveViewImage(final EdsCameraRef camera) { EdsError err = EdsError.EDS_ERR_OK; final EdsBaseRef.ByReference[] references = CanonUtils.getLiveViewImageReference(camera); if (references != null) { final EdsStreamRef.ByReference streamRef = (EdsStreamRef.ByReference) references[1]; final EdsEvfImageRef.ByReference imageRef = (EdsEvfImageRef.ByReference) references[0]; // // Get the incidental data of the image. // NativeLongByReference zoom = new NativeLongByReference( new NativeLong( 0 ) ); // Pointer data = zoom.getPointer(); // err = getPropertyData( image.getValue(), EdSdkLibrary.kEdsPropID_Evf_ZoomPosition, 0, // NativeLong.SIZE, data ); // if( err != EdsError.EDS_ERR_OK ){ // System.err.println( "Failed to download live view image, zoom value wasn't read (error "+ // err.value() + ": "+ err.name() + " - " + err.description() + ")" ); // return null; // } // // // Get the focus and zoom border position // EdsPoint point = new EdsPoint(); // data = point.getPointer(); // err = getPropertyData( image.getValue(), EdSdkLibrary.kEdsPropID_Evf_ZoomPosition, 0 , // sizeof( point ), data ); // if( err != EdsError.EDS_ERR_OK ){ // System.err.println( "Failed to download live view image, focus point wasn't read (error // "+ err.value() + ": "+ err.name() + " - " + err.description() + ")" ); // return null; // } final NativeLongByReference length = new NativeLongByReference(); err = CanonUtils.toEdsError(CanonCamera.EDSDK.EdsGetLength(streamRef.getValue(), length)); if (err != EdsError.EDS_ERR_OK) { System.err.println( "Failed to download live view image, failed to read stream length (error " + err.value() + ": " + err.name() + " - " + err.description() + ")"); CanonUtils.release(imageRef, streamRef); return null; } final PointerByReference ref = new PointerByReference(); err = CanonUtils.toEdsError(CanonCamera.EDSDK.EdsGetPointer(streamRef.getValue(), ref)); if (err != EdsError.EDS_ERR_OK) { System.err.println( "Failed to download live view image, failed to get reference to image in memory (error " + err.value() + ": " + err.name() + " - " + err.description() + ")"); CanonUtils.release(imageRef, streamRef); return null; } final byte[] data = ref.getValue().getByteArray(0, length.getValue().intValue()); try { final BufferedImage img = ImageIO.read(new ByteArrayInputStream(data)); return img; } catch (final IOException e) { e.printStackTrace(); } finally { CanonUtils.release(imageRef, streamRef); } } return null; }