如何使用Camera照相机API来选择前后相机来拍照

原创 2016年05月30日 11:47:27

在我们先前的文章"如何在Ubuntu手机中使用前置照相机"对如何使用前置照相机给出了一个解决方案.事实上,在我们最新的Camera API中 (QtMultiMedia 5.6),已经有新的API来完成这个功能了.我们不再需要额外的C++代码来完成这个功能.


在新的Camera API中,我们可以指定:

deviceId : string
来使得我们的Camera来选择我们需要的前后相机.那么我们如何得到这个deviceId呢?在新的QtMultiMedia的接口中,我们可以通过如下的API来得到所有的Camera的描述信息:

QtMultimedia.availableCameras

通过这个API,我们可以得到一个Camera的如下信息:


基于上面的信息,我们做了如下的一个简单的照相机应用:

Main.qml


import QtQuick 2.4
import Ubuntu.Components 1.3
import QtMultimedia 5.6

MainView {
    // objectName for functional testing purposes (autopilot-qt5)
    objectName: "mainView"

    // Note! applicationName needs to match the "name" field of the click manifest
    applicationName: "cameralist.liu-xiao-guo"

    width: units.gu(60)
    height: units.gu(85)

    Camera {
        id: camera

        imageProcessing.whiteBalanceMode: CameraImageProcessing.WhiteBalanceFlash

        exposure {
            exposureCompensation: -1.0
            exposureMode: Camera.ExposurePortrait
        }

        flash.mode: Camera.FlashRedEyeReduction

        imageCapture {
            id: capture
            onImageCaptured: {
                console.log("onImageCaptured!")
                // Show the preview in an Image
                photoPreview.source = preview
            }

            onImageSaved: {
                console.log("image has been saved: " + requestId);
                console.log("saved path: " + path);
            }
        }
    }

    Component {
        id: highlight
        Rectangle {
            width: parent.width
            height: listview.delegate.height
            color: "lightsteelblue"; radius: 5
            Behavior on y {
                SpringAnimation {
                    spring: 3
                    damping: 0.2
                }
            }
        }
    }

    Page {
        id: page
        header: PageHeader {
            id: pageHeader
            title: i18n.tr("cameralist")
        }

        Item {
            anchors {
                left: parent.left
                right: parent.right
                bottom: parent.bottom
                top: pageHeader.bottom
            }

            Column {
                anchors.fill: parent

                ListView {
                    id: listview
                    width: page.width
                    height: units.gu(20)

                    model: QtMultimedia.availableCameras
                    highlight:highlight
                    delegate: Item {
                        id: delegate
                        width: listview.width
                        height: layout.childrenRect.height + units.gu(0.5)

                        Column {
                            id: layout
                            width: parent.width

                            Text {
                                text: "deviceId: " + modelData.deviceId
                            }

                            Text {
                                text: "displayName: " + modelData.displayName
                            }

                            Text {
                                text: {
                                    switch(modelData.position) {
                                    case Camera.UnspecifiedPosition:
                                        return "position: UnspecifiedPosition"
                                    case Camera.BackFace:
                                        return "position: BackFace";
                                    case Camera.FrontFace:
                                        return "position: FrontFace"
                                    default:
                                        return "Unknown"
                                    }
                                }
                            }

                            Rectangle {
                                width: parent.width
                                height: units.gu(0.1)
                                color: "green"
                            }

                        }

                        MouseArea {
                            anchors.fill: parent
                            onClicked: {
                                camera.deviceId = modelData.deviceId
                                listview.currentIndex = index
                            }
                        }
                    }
                }

                VideoOutput {
                    id: output
                    source: camera
                    width: parent.width
                    height: parent.height - listview.height
                    focus : visible

                    MouseArea {
                        anchors.fill: parent
                        onClicked: {
                            console.log("going to capture to: " + path)
                            capture.captureToLocation(path);
                            output.visible = false
                            photoPreview.visible = true
                        }
                    }
                }

                Image {
                    id: photoPreview
                    width: parent.width
                    height: parent.height - listview.height
                    fillMode: Image.PreserveAspectFit

                    MouseArea {
                        anchors.fill: parent
                        onClicked: {
                            photoPreview.visible = false
                            output.visible = true
                        }
                    }

                    Component.onCompleted: {
                        visible = false
                    }
                }
            }
        }
    }
}

由于我们希望存储当前相机的所照的照片,我们必须得到能够存储照片的位置信息.我们在我们的Main.cpp中使用了如下的方法:

main.cpp

QString getPrivatePath()
{
    QString writablePath = QStandardPaths::
            writableLocation(QStandardPaths::DataLocation);
    qDebug() << "writablePath: " << writablePath;

    QString absolutePath = QDir(writablePath).absolutePath();
    qDebug() << "absoluePath: " << absolutePath;

    absolutePath += ".liu-xiao-guo/photos";

    // We need to make sure we have the path for storage
    QDir dir(absolutePath);
    if ( dir.mkpath(absolutePath) ) {
        qDebug() << "Successfully created the path!";
    } else {
        qDebug() << "Fails to create the path!";
    }

    qDebug() << "private path: " << absolutePath;

    return absolutePath;
}

    QString path = getPrivatePath();
    qDebug() << "final path: " << path;
   ...
    context->setContextProperty("path", QVariant::fromValue(path));

通过这样的方法,我们可以在我们的QML的代码中直接引用path来存储我们的照片.

运行我们的应用:

   


从上面的图中,我们可以看到所有相机的列表信息.我们可以随意选择我们所需要的相机,并进行拍摄.当然我们也可以进行录像的动作.具体的实现,可以参阅文章"在Ubuntu手机平台中使用Camera API来录像".


版权声明:本文为博主原创文章,未经博主允许不得转载。

Android开发学习之以CameraAPI方式实现相机功能(一)——快速实现相机

今天无意当中发现在《Android开发学习之基于ZBar实现微信扫一扫》中的一部分代码可以用来以硬件方式实现一个照相机的功能,在《Android开发学习之调用系统相机完成拍照的实现》中我们是以Inte...
  • qinyuanpei
  • qinyuanpei
  • 2014年01月13日 00:20
  • 4854

Android 相机Camera API 使用

Android 相机Camera API 使用 保证预览和存储的都是正方向 Camera2 API
  • hehe26
  • hehe26
  • 2016年11月01日 09:41
  • 2827

Android开发技巧——Camera拍照功能

本篇是我对开发项目的拍照功能过程中,对Camera拍照使用的总结。由于camera2是在api level 21(5.0.1)才引入的,而Camera到6.0仍可使用,所以暂未考虑camera2。文档...
  • maosidiaoxian
  • maosidiaoxian
  • 2016年03月01日 17:58
  • 18446

ionic2 --拍照

1、安装ionic native插件  git地址:     https://github.com/apache/cordova-plugin-camera  $ ionic ...
  • baidu_34635864
  • baidu_34635864
  • 2017年09月25日 14:25
  • 152

iOS 拍照与相片选择,在模拟器上拍照时做一个友好提示

- (IBAction)singleTapAction:(id)sender {     UIActionSheet *sheet = [[UIActionSheet alloc]init]; ...
  • xcp_123
  • xcp_123
  • 2016年12月06日 15:20
  • 754

Android简单调用相机Camera功能,实现打开照相功能

在最开始接触Android相机功能之前,先来体验一下Android调用系统照相功能吧核心代码Intent intent = new Intent(); //调用照相机intent.setAction(...
  • w_yunlong
  • w_yunlong
  • 2015年12月29日 11:55
  • 7879

Android自定义相机的实现以及Camera框架分析

一:Android Camera框架分析: (1).Android Camera框架层结构是C/S结构,客户端提供调用 接口,服务器端实现具体的功能。客户端和服务器端是通过Binder机...
  • u014225510
  • u014225510
  • 2015年04月23日 22:14
  • 1523

Android实例讲解自定义Camera拍照和预览以及前后置摄像头切换

本博文将通过实例实现自定义Camera的功效。具体功能如下: 1.实现自定义Camera拍照; 2.实现前后置摄像头的切换; 3.实现Camera拍照后图片缩小显示以及正常预览; ...
  • lyglostangel
  • lyglostangel
  • 2016年05月20日 11:14
  • 3483

RN-第三方-react-native-camera,调用相机拍摄图片

本文内容 自定义相机拍照,上传图片 react-native-image-picker这个同样可以实现相机拍照,但是是调用的系统的相机,相对于自定义较为简单,功能很强大。 rea...
  • sinat_17775997
  • sinat_17775997
  • 2017年06月27日 19:51
  • 3360

Android开发-拍照录像-AndroidStudio(二)VCamera拍摄小视频初体验

转载请注明出处:http://blog.csdn.net/iwanghang/我正在参加CSDN 2016博客之星评选,希望得到您的宝贵一票~http://blog.csdn.net/vote/can...
  • iwanghang
  • iwanghang
  • 2016年12月02日 15:49
  • 1725
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何使用Camera照相机API来选择前后相机来拍照
举报原因:
原因补充:

(最多只允许输入30个字)