/* * This code released into the public domain 21 July 2008 * * This program does the equivalent of: * gphoto2 --shell * > set-config capture=1 * > capture-image-and-download * compile with gcc -Wall -o canon-capture -lgphoto2 canon-capture.c * * Taken from: http://credentiality2.blogspot.com/2008/07/linux-libgphoto2-image-capture-from.html * * and condensed into simple capture sample */ #include #include #include #include #include #include #include #include #include "samples.h" static void errordumper(GPLogLevel level, const char *domain, const char *str, void *data) { fprintf(stdout, "%s\n", str); } static void capture_to_memory(Camera *camera, GPContext *context, const char **ptr, unsigned long int *size) { int retval; CameraFile *file; CameraFilePath camera_file_path; printf("Capturing.\n"); /* NOP: This gets overridden in the library to /capt0000.jpg */ strcpy(camera_file_path.folder, "/"); strcpy(camera_file_path.name, "foo.jpg"); retval = gp_camera_capture(camera, GP_CAPTURE_IMAGE, &camera_file_path, context); printf(" Retval: %d\n", retval); printf("Pathname on the camera: %s/%s\n", camera_file_path.folder, camera_file_path.name); retval = gp_file_new(&file); printf(" Retval: %d\n", retval); retval = gp_camera_file_get(camera, camera_file_path.folder, camera_file_path.name, GP_FILE_TYPE_NORMAL, file, context); printf(" Retval: %d\n", retval); gp_file_get_data_and_size (file, ptr, size); printf("Deleting.\n"); retval = gp_camera_file_delete(camera, camera_file_path.folder, camera_file_path.name, context); printf(" Retval: %d\n", retval); /*gp_file_free(file); */ } static void capture_to_file(Camera *camera, GPContext *context, char *fn) { int fd, retval; CameraFile *file; CameraFilePath camera_file_path; CameraFileInfo info; printf("Capturing.\n"); /* NOP: This gets overridden in the library to /capt0000.jpg */ strcpy(camera_file_path.folder, "/"); strcpy(camera_file_path.name, "foo.jpg"); retval = gp_camera_capture(camera, GP_CAPTURE_IMAGE, &camera_file_path, context); printf(" Retval: %d\n", retval); printf("Pathname on the camera: %s/%s\n", camera_file_path.folder, camera_file_path.name); retval = gp_camera_file_get_info (camera, camera_file_path.folder, camera_file_path.name, &info, context); printf (" file info reported flags: %d\n", info.file.fields); if (info.file.fields & GP_FILE_INFO_MTIME) printf (" info reported mtime: %ld\n", info.file.mtime); if (info.file.fields & GP_FILE_INFO_SIZE) printf (" info reported size: %ld\n", info.file.size); if (info.file.fields & GP_FILE_INFO_TYPE) printf (" info reported type: %s\n", info.file.type); fd = open(fn, O_CREAT | O_WRONLY | O_BINARY, 0644); retval = gp_file_new_from_fd(&file, fd); printf(" Retval: %d\n", retval); retval = gp_camera_file_get(camera, camera_file_path.folder, camera_file_path.name, GP_FILE_TYPE_NORMAL, file, context); printf(" Retval: %d\n", retval); gp_file_free(file); printf("Deleting.\n"); retval = gp_camera_file_delete(camera, camera_file_path.folder, camera_file_path.name, context); printf(" Retval: %d\n", retval); } int main(int argc, char **argv) { Camera *camera; int retval; GPContext *context = sample_create_context(); FILE *f; char *data; unsigned long size; gp_log_add_func(GP_LOG_ERROR, errordumper, NULL); gp_camera_new(&camera); /* When I set GP_LOG_DEBUG instead of GP_LOG_ERROR above, I noticed that the * init function seems to traverse the entire filesystem on the camera. This * is partly why it takes so long. * (Marcus: the ptp2 driver does this by default currently.) */ printf("Camera init. Takes about 10 seconds.\n"); retval = gp_camera_init(camera, context); if (retval != GP_OK) { printf(" Retval of capture_to_file: %d\n", retval); exit (1); } capture_to_file(camera, context, "foo.jpg"); capture_to_memory(camera, context, (const char**)&data, &size); f = fopen("foo2.jpg", "wb"); if (f) { retval = fwrite (data, size, 1, f); if (retval != (int)size) { printf(" fwrite size %ld, written %d\n", size, retval); } fclose(f); } else printf(" fopen foo2.jpg failed.\n"); gp_camera_exit(camera, context); return 0; }