我是libgphoto2的新手,并对实际图像内存的位置有疑问。看来照片是通过称为CameraFile
的对象访问的。源文件中包含一个名为sample-capture.c的示例,该示例具有一个名为capture_to_memory
的函数。
在该函数中,使用gp_file_new
创建并初始化CameraFile对象。 gp_file_new
的实现创建一个CameraFile
对象,其accesstype成员设置为GP_FILE_ACCESSTYPE_MEMORY
。
然后将该CameraFile
对象传递给gp_camera_file_get
,我不清楚该函数会发生什么。
调用gp_camera_file_get
之后,文件将发送到gp_file_get_data_and_size
。查看该函数的实现,并假设文件访问类型为GP_FILE_ACCESSTYPE_MEMORY
,gp_file_get_data_and_size
函数将不会分配任何内存,而只会将指针分配给CameraFile的数据成员(与大小相同)。
那么该指针指向的内存在哪里?是在实际的相机上吗?还是在我的公羊里?我只是想避免尽可能多的内存操作。我找到了一篇不错的博客文章
http://sepharads.blogspot.com/2011/11/camera-tethered-capturing-using.html?m=1
其中CameraFile
对象是通过gp_file_new_from_fd
创建的。这会将文件访问类型设置为GP_FILE_ACCESSTYPE_FD
。在具有此访问类型的文件上调用gp_file_get_data_and_size
时,将分配新的内存,并将文件的数据复制到其中。但是,这是从磁盘读取的,或者至少我认为是因为FD表示Unix File Descriptor,并且它需要一个实际的文件名字符串。如果CameraFile的访问类型为gp_camera_file_get
,这是否意味着GP_FILE_ACCESSTYPE_FD
将数据读取到磁盘上的文件中?
有一个名为gp_file_free
的函数。如果它是FD文件,则会关闭文件句柄,但不会在任何地方调用free(file->data)
,所以我很困惑...gp_camera_file_get
是做什么的?那里有实现,但是有点让我失望。它实际上会将文件从相机的内存带到计算机的内存,并在ram中分配CameraFile->data
吗?还是只是让我掌握了存储在相机上的东西?
抱歉,如果这是错误的地方,我确实看到了libgphoto2的某种邮件列表,但我无法说出它的活跃程度。
最佳答案
没关系,我想我已经找到了。
因此,gp_camera_file_get
最终调用了gp_filesystem_get_file
,后者又调用了gp_filesystem_get_file_impl
。该函数查看CameraFileType
,如果它是GP_FILE_TYPE_NORMAL
(在我的情况下为gp_file_copy
),它将使用CameraFileSystemFile实例作为源调用gp_file_copy
。
如果malloc
是目标文件的访问类型,则GP_FILE_ACCESSTYPE_MEMORY
最终会调用GP_FILE_ACCESSTYPE_FD
;如果访问类型是gp_file_free
,则gp_file_clean
会写入磁盘。
然后,对free
的调用将调用GP_FILE_ACCESSTYPE_MEMORY
,如果访问类型为ojit_code,则将调用ojit_code。
关于c++ - gp_camera_file_get如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34050599/