2016-10-03 23 views
0

我工作的一个图像处理应用的ImageCapture中删除拍摄的图像和我用这个代码在QML相机

Camera { 
    id: cam 
    viewfinder.resolution: "640x480" 
    viewfinder.minimumFrameRate: 5 
    captureMode: Camera.CaptureStillImage 
    imageCapture { 
     resolution: "640x480" 
     onReadyChanged: { 
      imageDecoder.reset() // my decoder class 
      cam.imageCapture.capture() 
     } 
     onImageCaptured: { 
      console.log(requestId, preview) 
      imageDecoder.decodeQmlPreview(preview) 
     } 
    } 
    imageProcessing { 
     contrast: 0.60 
    } 
} 


VideoOutput { 
    id: output 
    fillMode: VideoOutput.PreserveAspectCrop 
    anchors.fill: parent 
    source: cam   
} 

我看到所有这些拍摄图像(preview)存储在硬盘上,并永远不会被删除。如何删除这些图像?我的硬盘空间非常有限。

# ls -lh | grep IMG 
-rw-r--r-- 1 root  root  10.5K Jan 1 00:40 IMG_00000001.jpg 
-rw-r--r-- 1 root  root  12.2K Jan 1 00:45 IMG_00000002.jpg 
-rw-r--r-- 1 root  root  15.6K Jan 1 00:48 IMG_00000003.jpg 
-rw-r--r-- 1 root  root  15.6K Jan 1 00:49 IMG_00000004.jpg 
-rw-r--r-- 1 root  root  11.4K Jan 1 01:05 IMG_00000005.jpg 
+0

你是否确定这些是来自你的qml?你怎么隔离它?\ –

+0

@KubaOber他们确实匹配视频输出显示。我删除了所有这些文件并重新运行应用程序。文件计数符合我处理的图像数量。 – ramtheconqueror

+0

然后,只要你显示的代码完整,我会认为它是一个Qt错误。如果是这样,请提交错误报告。 –

回答

1

QML具有对FS相当隐含关系 - 它的内部功能将读取和写入有时,但它似乎并不具备为用户直接与FS交互定义的API。

这意味着您将不得不在C++中实现该功能,并将其展示给QML。

我的做法是创建一个class System : public QObject并把所有必要的东西里面,然后在main.cpp

System s(&engine); 
    engine.rootContext()->setContextProperty("Sys", &s); 

然后从QML你可以简单Sys.doYourStuff()。在你的情况下,你需要静态功能bool QFile::remove(const QString &fileName)

+0

谢谢,如何从'QUrl'又名'preview'在FS上找到实际的文件名? – ramtheconqueror

+0

命名方案是统一的,所以你可以去那里删除每个预览中创建的图像。调查命名行为如何在文件被删除时起作用。你可能需要在你的QML代码中加一个计数器来跟踪你应该删除哪个文件。 – dtech