zoukankan      html  css  js  c++  java
  • Android中级第五讲获得并设置相机分辨率以及镜头图片倒转问题


                  博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Redserved !  


    今天我们讲一下如何获得并设置相机分辨率的问题,算是技术贴,也算知识扫盲贴。

    有很多网友会问,为什么我的相机设置分辨率没效果啊?


    首先,做相机程序,必须要硬件支持!如开启声音、分辨率设置、对焦等功能。

    如果说不支持就得到不到想到的效果,如很多相机程序可以设置分辨率,但感觉不成功,500w的相机,愣是只有300w的效果。


    这里主要讲如何利用surfaceView来开发相机,并设置分辨率参数,以此来设置图片的大小,此方法应在surfaceChanged或者surfaceCreated方法里执行,

    如选surfaceCreated,那配置要另写一个页面,这样camera会被destroy掉,然后回来再被created,当然这个方法比较简单;

    如选surfaceChanged,配置写在本页面即可,但实现起来有些难度。

    代码如下:

    // 获得相机参数
    Camera.Parameters parameters = camera.getParameters();
    if (TextUtils.isEmpty(g3_setting.getString(AppData.G3_CAMERA_SIZE,
    ""))) {
    // 获取自己手机合适的尺寸
    StringBuffer sb = new StringBuffer();
    List<Camera.Size> sizeList = parameters
    .getSupportedPreviewSizes();
    Iterator<Camera.Size> itor1 = sizeList.iterator();
    while (itor1.hasNext()) {
    Camera.Size cur = itor1.next();
    String str = cur.height + "x" + cur.width + ":";
    sb.append(str);
    }
    Log.i("Travel", "sb……" + sb.toString());
    Editor editor = g3_setting.edit();
    editor.putString(AppData.G3_CAMERA_SIZE, sb.toString());
    editor.commit();
    }
    // 设置分辨率
    pic_Width = g3_setting.getInt(AppData.G3_PIC_WIDTH, 800);
    pic_Height = g3_setting.getInt(AppData.G3_PIC_HEIGHT, 640);
    Log.i("Travel", pic_Height + ":" + pic_Width);
    // 设置照片大小
    parameters.setPictureSize(pic_Width, pic_Height);
    如果只讲分辨率,觉得本篇博文讲的太少了,那么再加入两个知识点,使surfaceView开发相机程序时,为什么,镜头是倒着的、图片是倒着的,以及解决方案。
    毋庸置疑,镜头设置也是由硬件支持的,大部分支持,少部分不支持。
    关于镜头左转90的问题。
    相机经常捕获的画面和手机方向不一致,比如手机是竖着拿的,但是画面是横的,这是由于摄像头默认是根据横向来捕获画面的,但你的手机是竖着的。
    解决办法:
    在设置相机参数时加入如下代码
    // 设置镜头翻转
    if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
    setDisplayOrientation(camera, 90);
    } else {
    parameters.setRotation(90);
    }


    protected void setDisplayOrientation(Camera camera, int angle) {
    Method downPolymorphic;
    try {
    downPolymorphic = camera.getClass().getMethod(
    "setDisplayOrientation", new Class[] { int.class });
    if (downPolymorphic != null)
    downPolymorphic.invoke(camera, new Object[] { angle });
    } catch (Exception e1) {
    }
    }
    关于图片保存时,左转90度的问题,原因如上所述
    解决办法:
    if (AppData.isLandscape) { // 竖拍
    Matrix matrix = new Matrix();
    matrix.reset();
    matrix.postRotate(90);
    bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(),
    bMap.getHeight(), matrix, true);
    bMap = bMapRotate;
    }
    BufferedOutputStream bos = new BufferedOutputStream(
    new FileOutputStream(file));
    bMap.compress(Bitmap.CompressFormat.PNG, 100, bos);// 将图片压缩到流中
    bos.flush();// 输出
    bos.close();// 关闭


    欢迎大家踊跃交流!


    示例DEMO:Android对焦拍照功能实现


    
    

  • 相关阅读:
    mac os programming
    Rejecting Good Engineers?
    Do Undergrads in MIT Struggle to Obtain Good Grades?
    Go to industry?
    LaTex Tricks
    Convert jupyter notebooks to python files
    How to get gradients with respect to the inputs in pytorch
    Uninstall cuda 9.1 and install cuda 8.0
    How to edit codes on the server which runs jupyter notebook using your pc's bwroser
    Leetcode No.94 Binary Tree Inorder Traversal二叉树中序遍历(c++实现)
  • 原文地址:https://www.cnblogs.com/fengju/p/6174470.html
Copyright © 2011-2022 走看看