BlackBerry 拍照编程

BlackBerry SDK 5.0 以及之前的版本通过MMAPI实现拍照功能,主要的功能包包括:

·         javax.microedition.media

·         javax.microedition.media.control

·         javax.microedition.amms.control.camera

拍照应用包括如下几部分:

·         获取黑莓手机相机支持信息,照片大小,格式,照片质量

·         显示并确定照片设置

·         打开相机设备,设置自动对焦,显示摄像头图像

·         拍照

获取支持的照片规格

照片规格通过4种属性来定义:照片宽度,照片高度,照片格式,和照片质量。为了方便定义照片规格,需要一个照片规格类,比如叫EncodingProperties,代码如下:

/**

 * 定义照片规格,通过函数getFullEncoding()为拍照函数VideoControl.getSnapshot()提供

 * 照片定义

 */

public final class EncodingProperties

{  

    /** 照片格式 */

    private String _format;

 

    /** 照片宽 */

    private String _width;

 

    /** 照片高 */

    private String _height;

 

    /** 照片质量 */

    private String _quality;

   

    public void setFormat(String format)

    {

        _format = format;

    }

 

    public void setWidth(String width)

    {

        _width = width;

    }

 

    public void setHeight(String height)

    {

        _height = height;

    }

 

    public void setQuality(String quality)

    {

        _quality = quality;

    }

 

    /**

     * VideoControl.getSnapshot(EncodingProperties.getFullEncoding())

     */

    public String getFullEncoding()

    {

        StringBuffer fullEncoding = new StringBuffer();

 

        fullEncoding.append("encoding=");

        fullEncoding.append(_format);

 

        fullEncoding.append("&width=");

        fullEncoding.append(_width);

 

        fullEncoding.append("&height=");

        fullEncoding.append(_height);

 

        fullEncoding.append("&quality=");

        fullEncoding.append(_quality);

 

        return fullEncoding.toString();

} 

}  

 

 

 

 

 

照片规格类定义完毕,下面要获取照片规格,代码如下:

 

private EncodingProperties[] getEncodingList(){

 try

 {

        // 最终需要的照片规格

        EncodingProperties[] encodings = null;

    

        // 获取照片规格

        String encodingString = System.getProperty("video.snapshot.encodings");

       

        // 初步解析照片规格

        String[] properties = StringUtilities.stringToKeywords(encodingString);

       

        Vector encodingList = new Vector();

       

        String encoding = "encoding";

        String width = "width";

        String height = "height";

        String quality = "quality";

 

 

        EncodingProperties temp = null;

       

        // 开始解析照片规格并组装成我们定义的照片规格

        for(int i = 0; i < properties.length ; ++i)

        {

            if( properties[i].equals(encoding))

            {

                if(temp != null && temp.isComplete())

                {

                    // Add a new encoding to the list if it has been

                    // properly set.

                    encodingList.addElement( temp );

                }

                temp = new EncodingProperties();

               

                // Set the new encoding's format

                ++i;

                temp.setFormat(properties[i]);

            }

            else if( properties[i].equals(width))

            {

                // Set the new encoding's width

                ++i;

                temp.setWidth(properties[i]);

            }

            else if( properties[i].equals(height))

            {

                // Set the new encoding's height

                ++i;

                temp.setHeight(properties[i]);

            }

            else if( properties[i].equals(quality))

            {

                // Set the new encoding's quality

                ++i;

                temp.setQuality(properties[i]);

            }

        }

       

        // If there is a leftover complete encoding, add it.

        if(temp != null && temp.isComplete())

        {

            encodingList.addElement( temp );

        }

       

        // Convert the Vector to an array for later use

        encodings = new EncodingProperties[ encodingList.size() ];

        encodingList.copyInto((Object[])encodings);

    }

    catch (Exception e)

    {

        // Something is wrong, indicate that there are no encoding options

        encodings = null;

}

// 返回需要的照片规格

return encodings;

} 

 

这是BlackBerry 9700所支持的照片规格。

 

启动摄像头准备拍照

首先要初始化摄像头,然后启动摄像头,设置自动对焦,再把展现摄像的Field添加到屏幕上。

    /**

     * 初始化Player, VideoControl VideoField

     */

private void initializeCamera()

{

try{

 

// 注意这里的参数是 “capture://video”Player作为摄像用

Player player = Manager.createPlayer( "capture://video" );

 

// 预备摄像

player.realize();

 

// 获取 VideoControl

_videoControl = (VideoControl)player.getControl( "VideoControl" );

        

// 获取 FocusControl  

_focusControl = (FocusControl) player.getControl("javax.microedition.amms.control.camera.FocusControl");

 

if (_videoControl != null)

{

    // 获取显示VideoUI组件:Field

_videoField = (Field) _videoControl.initDisplayMode  

              (VideoControl.USE_GUI_PRIMITIVE,

               "net.rim.device.api.ui.Field");

    _videoControl.setDisplayFullScreen(true);

    _videoControl.setVisible(true);

}

 

if (_focusControl != null)

{

    _focusControl.setFocus(FocusControl.AUTO);

}

 

// 启动摄像头

player.start();

 

// 添加到屏幕

add(_videoField);

 

}

catch(Exception e)

{

   System.out.println("ERROR " + e.getClass() + ":  " + e.getMessage());

}

 

}

 

两个关键的类分别是 VideoControlFocusControlVideoControl控制在哪个UI组件上显示摄像头捕捉到的Video。这里指定是在Field上显示Video,显示模式为全屏。FocusControl控制对焦,可以设置自动对焦或者自定对焦。

 

拍照

拍照要设定照片规格,在使用VideoControl拍照,代码如下:

/**

 * 按指定的照片规格拍照

 */  

public Bitmap takePicture(){

  try{

       Bitmap image = null;

       String encoding = null;           

           

       if( _encodings != null )

       {

           // 指定照片规格

           encoding = _encodings[_indexOfEncoding].getFullEncoding();

       }

           

       // 指定照片规格,使用VideoControl拍照

       // 照片规格范例: encoding=jpeg&width=1024&height=768&quality=normal

       byte[] raw = _videoControl.getSnapshot( encoding );

           

       // 组装成图片

       image = Bitmap.createBitmapFromBytes( raw, 0, -1, 1 );

   }

   catch(Exception e)

   {

       PingAn.errorDialog("ERROR " + e.getClass() + ":  " + e.getMessage());

   } 

  

   return image;

}

 

这段代码指定照片规格并使用VideoControl拍照。照片规格范例:

String encoding = “encoding=jpeg&width=1024&height=768&quality=normal”;

使用照片规格拍照:

byte[] raw = _videoControl.getSnapshot(encoding);

获取的图片二进制数据流可以被组装成图片。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值