×
Namespaces

Variants
Actions
(Difference between revisions)

不通过Qt Mobility操纵Symbian设备的相机

From Nokia Developer Wiki
Jump to: navigation, search
zhouhl (Talk | contribs)
zhouhl (Talk | contribs)
Line 135: Line 135:
 
</code>
 
</code>
  
 +
拍摄完之后,我们也许还想存一下照片,不用担心,本例程中同样包含了保存照片的例子代码,并且还额外提供了一个非常方便的用于打开文件的类XQUtils。
 +
好了,到此一个拍摄的过程就基本结束了,我们可以一直这么循环拍摄下去,直到用户推出程序。
  
 +
一定要记得退出程序需要做的清理工作:
 +
<code cpp>
 +
void XQCamera::close();
 +
</code>
 +
此函数释放程序对camera的占用,并power off相机。
 +
 +
 +
 +
==可以改进的地方 ==
 +
需要注意的是在API的源码中,也就是在XQCameraPrivate中,使用了一个iCaptureSize(QSize(640, 480)),这里的size不同于viewfinder的size,这个size指的是所拍摄照片的尺寸。这个程序里面是写死的,我们可以进行更改,比如如果相机硬件支持更大尺寸的照片,我们可以设置的更大一些,比如:
 +
<code cpp>
 +
XQCameraPrivate::XQCameraPrivate(XQCamera* qq) : q(qq), iCaptureSize(QSize(640, 480))
 +
{
 +
}
 +
</code>
 +
另外取景的图片我们也是可以设置得更大一些,从而使得取景的画面更清晰一些,例如:
 +
<code cpp>
 +
iCaptureSize(QSize(640, 480))
 +
</code>
  
  

Revision as of 14:23, 5 September 2010

Contents

概述

标准Qt API没有为我们提供操纵Symbian设备的相机的接口,包括现在的Qt Mobility 1.0.2也没有为我们提供相应的接口。Qt Mobility 1.1倒是包含了camera的部分,不过现在的Qt Mobility 1.1还只是一个Technology Preview版本。

本文将通过另一种方式为大家提供一种Symbian设备上的Qt camera API,它不使用Qt Mobility,直接封装的是Symbian代码。此camera API的所有源码以及例程都可以通过本文末尾所附链接下载。本例程大部分源码得益于Mobile Extensions for Qt for SymbianS60 Platform: Camera Example v3.0,以及Liuxg的指导,在此一并表示感谢。

下面就具体为大家讲解如何使用这个camera API。


将API源码加入工程

首先,解压附件testOfCameraApiOnN8.zip 得到testOfCameraApiOnN8文件夹,将testOfCameraApiOnN8文件夹里的cameraX文件夹整体拷贝到当前Qt工程的根目录。
然后修改pro文件,将API源码添加进去:

SOURCES +=  cameraX\xqviewfinderwidget.cpp \
cameraX\xqviewfinderwidget_p.cpp \
cameraX\xqcamera.cpp \
cameraX\xqcamera_p.cpp\
cameraX\xqutils.cpp \
cameraX\xqutils_p.cpp \
cameraX\xqconversions.cpp
 
HEADERS += cameraX\xqviewfinderwidget.h \
cameraX\xqviewfinderwidget_p.h \
cameraX\xqcamera.h \
cameraX\xqcamera_p.h \
cameraX\xqutils.h \
cameraX\xqutils_p.h \
cameraX\xqconversions.h

接着继续修改pro文件,把API所用到的公共Symbian库文件添加进去:

    LIBS += -lfbscli\
-lapmime \
-lcommonui \
-lplatformenv \
-lcharconv

将API所依赖的CameraWrapper加入SDK和device

由于API中用到了并未加入公版SDK的Symbian库,所以我们需要手动加入,不过也很简单,我们可以让程序在编译的时候自动替我们加上。
首先将testOfCameraApiOnN8文件夹里的cameraengineWrapper文件夹整体拷贝到当前Qt工程的根目录。
然后先向SDK加入所依赖的头文件和库:

    BLD_INF_RULES.prj_exports += \                                                                                       
"cameraengineWrapper\InstallToSDK\epoc32\include\cameraengine.h \epoc32\include\cameraengine.h" \
"cameraengineWrapper\InstallToSDK\epoc32\include\cameraengineobserver.h \epoc32\include\cameraengineobserver.h" \
"cameraengineWrapper\InstallToSDK\epoc32\release\armv5\lib\camerawrapper.dso \epoc32\release\armv5\lib\camerawrapper.dso" \
"cameraengineWrapper\InstallToSDK\epoc32\release\armv5\lib\camerawrapper.lib \epoc32\release\armv5\lib\camerawrapper.lib" \
"cameraengineWrapper\InstallToSDK\epoc32\release\armv5\lib\camerawrapper{000a0000}.dso \epoc32\release\armv5\lib\camerawrapper{000a0000}.dso" \
"cameraengineWrapper\InstallToSDK\epoc32\release\armv5\lib\camerawrapper{000a0000}.lib \epoc32\release\armv5\lib\camerawrapper{000a0000}.lib" \
"cameraengineWrapper\InstallToSDK\epoc32\release\armv5\urel\camerawrapper.dll \epoc32\release\armv5\urel\camerawrapper.dll" \
"cameraengineWrapper\InstallToSDK\epoc32\release\armv5\urel\camerawrapper.dll.map \epoc32\release\armv5\urel\camerawrapper.dll.map" \
"cameraengineWrapper\InstallToSDK\epoc32\release\winscw\udeb\CamAutoFocus.dll \epoc32\release\winscw\udeb\CamAutoFocus.dll" \
"cameraengineWrapper\InstallToSDK\epoc32\release\winscw\udeb\camerawrapper.dll \epoc32\release\winscw\udeb\camerawrapper.dll" \
"cameraengineWrapper\InstallToSDK\epoc32\release\winscw\udeb\camerawrapper.lib \epoc32\release\winscw\udeb\camerawrapper.lib" \

再将CameraWrapper一起打包入SIS:

cameraengineEmbeddedsis.pkg_postrules = "@\"cameraengineWrapper\InstallToDevice\camerawrapper.sisx\",(0x2001EC5F)"
DEPLOYMENT += cameraengineEmbeddedsis

最后将CameraWrapper库链接到我们自己的Qt工程:

    LIBS += -lcamerawrapper

在代码中使用camera API

好了,经过上述步骤,我们终于成功的做完了所有准备工作,下面就可以使用这个camera API了。
首先在需要使用camera的地方引入API头文件:

#include "xqcamera.h"

在需要显示camera所捕获图像的地方引入API头文件:

#include "xqviewfinderwidget.h"

接下来就可以创建一个XQCamera对象,以及对应的XQViewFinderWidget。XQViewFinderWidget是用于显示XQCamera所捕获的图像的一个QWidget。 然后记得把创建的XQCamera对象赋给XQViewFinderWidget,使他们之间建立对应关系。

viewFinderWidget->setCamera(*m_camera);

可以通过XQViewFinderWidget来设置viewfinder的尺寸,viewfinder的尺寸和呈现在手机屏幕上的取景画面直接相关。例如我们可以设置:

viewFinderWidget->setViewfinderSize(QSize(128, 96));


打开相机,使用:

bool XQCamera::open(int index);

当camera被成功打开,并且可以使用的时候,XQCamera 会发送一个 cameraReady() 的signal 。
参数index表示要打开哪一个相机,比如N97上就有两个相机,默认是0。如果返回值为false,表明发生了错误,我们可以调用error()来获取具体是那种错误。


打开相机之后,我们需要等待 cameraReady()信号,如果camera没有ready,我们是没办法使用相机的。
当我们收到cameraReady()信号之后,我们就可以启动Viewfinder了,调用bool XQViewFinderWidget::start(),例如我们可以这样做:

connect(m_camera, SIGNAL(cameraReady()), viewFinderWidget, SLOT(start()));

bool XQViewFinderWidget::start()所做的是启动Viewfinder,Viewfinder启动后的就会不间断将camera所捕获的图像传递给XQViewFinderWidget,并在UI界面上显示出来。

拍照,使用:

bool XQCamera::capture();

此函数令camera开始拍照,当图像拍好之后,XQCamera会发送一个captureCompleted()的 signal。
如果返回值为false,表明发生了错误,我们可以调用error()来获取具体是那种错误。

我们可以这样捕获 captureCompleted()信号:

connect(m_camera, SIGNAL(captureCompleted(QImage*)), this, SLOT(captured(QImage*)));

收到 captureCompleted()的信号之后,我们就可以进行自己的处理了,首先必须要做的是要停止viewfinder,然后通常是将拍摄的画面显示在屏幕上,例如:

void testOfCameraApiOnN8MainWindow::captured(QImage* snapImage)
{
ui->viewFinderWidget->stop();
 
m_image = QPixmap::fromImage(snapImage->copy()).toImage();
m_camera->releaseImageBuffer();
ui->viewFinderWidget->setImage(m_image);
 
m_captureAction->setDisabled(true);
m_changeCameraAction->setDisabled(true);
m_focusAction->setDisabled(true);
m_newPhotoAction->setEnabled(true);
m_saveAction->setEnabled(true);
ui->captureButton->setDisabled(true);
}

拍摄完之后,我们也许还想存一下照片,不用担心,本例程中同样包含了保存照片的例子代码,并且还额外提供了一个非常方便的用于打开文件的类XQUtils。 好了,到此一个拍摄的过程就基本结束了,我们可以一直这么循环拍摄下去,直到用户推出程序。

一定要记得退出程序需要做的清理工作:

void XQCamera::close();

此函数释放程序对camera的占用,并power off相机。


可以改进的地方

需要注意的是在API的源码中,也就是在XQCameraPrivate中,使用了一个iCaptureSize(QSize(640, 480)),这里的size不同于viewfinder的size,这个size指的是所拍摄照片的尺寸。这个程序里面是写死的,我们可以进行更改,比如如果相机硬件支持更大尺寸的照片,我们可以设置的更大一些,比如:

XQCameraPrivate::XQCameraPrivate(XQCamera* qq) : q(qq), iCaptureSize(QSize(640, 480))
{
}

另外取景的图片我们也是可以设置得更大一些,从而使得取景的画面更清晰一些,例如:

iCaptureSize(QSize(640, 480))


测试设备

本代码已通过在N97上的测试。
下面是程序在N97上运行时的截图:
Camera.JPG


下载源码和例子程序

Media:VibraFN.zip

272 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×