Android中級第五講–獲得並設置相機分辨率以及鏡頭圖片倒轉問題

今天我們講一下如何獲得並設置相機分辨率的問題,算是技術貼,也算知識掃盲貼。

 

有很多網友會問,為什麼我的相機設置分辨率沒效果啊?

 

 

 

 

首先,做相機程序,必須要硬件支持!如開啟聲音、分辨率設置、對焦等功能。

 

如果說不支持就得到不到想到的效果,如很多相機程序可以設置分辨率,但感覺不成功,500w的相機,愣是隻有300w的效果。

 

 

 

 

這裡主要講如何利用surfaceView來開發相機,並設置分辨率參數,以此來設置圖片的大小,此方法應在surfaceChanged或者surfaceCreated方法裡執行,

 

如選surfaceCreated,那配置要另寫一個頁面,這樣camera會被destroy掉,然後回來再被created,當然這個方法比較簡單;

 

如選surfaceChanged,配置寫在本頁面即可,但實現起來有些難度。

 

代碼如下:

 

 

[html]  

// 獲得相機參數  

            Camera.Parameters parameters = camera.getParameters();  

            if (TextUtils.isEmpty(g3_setting.getString(AppData.G3_CAMERA_SIZE,  

                    ""))) {  

                // 獲取自己手機合適的尺寸  

                StringBuffer sb = new StringBuffer();  

                List sizeList = parameters  

                        .getSupportedPreviewSizes();  

                Iterator 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);  

 

// 獲得相機參數

Camera.Parameters parameters = camera.getParameters();

if (TextUtils.isEmpty(g3_setting.getString(AppData.G3_CAMERA_SIZE,

""))) {

// 獲取自己手機合適的尺寸

StringBuffer sb = new StringBuffer();

List sizeList = parameters

.getSupportedPreviewSizes();

Iterator 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);[html] view plaincopyprint?

如果隻講分辨率,覺得本篇博文講的太少瞭,那麼再加入兩個知識點,使surfaceView開發相機程序時,為什麼,鏡頭是倒著的、圖片是倒著的,以及解決方案。

 

如果隻講分辨率,覺得本篇博文講的太少瞭,那麼再加入兩個知識點,使surfaceView開發相機程序時,為什麼,鏡頭是倒著的、圖片是倒著的,以及解決方案。毋庸置疑,鏡頭設置也是由硬件支持的,大部分支持,少部分不支持。

 

 

 

 

關於鏡頭左轉90的問題。

 

相機經常捕獲的畫面和手機方向不一致,比如手機是豎著拿的,但是畫面是橫的,這是由於攝像頭默認是根據橫向來捕獲畫面的,但你的手機是豎著的。

 

 

解決辦法:

 

在設置相機參數時加入如下代碼

 

 

[html]  

// 設置鏡頭翻轉  

if (Integer.parseInt(Build.VERSION.SDK) >= 8) {  

    setDisplayOrientation(camera, 90);  

} else {  

    parameters.setRotation(90);  

}  

 

// 設置鏡頭翻轉

if (Integer.parseInt(Build.VERSION.SDK) >= 8) {

setDisplayOrientation(camera, 90);

} else {

parameters.setRotation(90);

}

[java] 

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) {  

    }  

}  

 

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度的問題,原因如上所述

 

解決辦法:

 

 

[java]  

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));  

 

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));[java] view plaincopyprint?

bMap.compress(Bitmap.CompressFormat.PNG, 100, bos);// 將圖片壓縮到流中   

        bos.flush();// 輸出   

        bos.close();// 關閉  

 

bMap.compress(Bitmap.CompressFormat.PNG, 100, bos);// 將圖片壓縮到流中

bos.flush();// 輸出www.aiwalls.com

bos.close();// 關閉

 

 

 

歡迎大傢踴躍交流!

 

 

 

博客出自:https://blog.csdn.net/liuxian13183

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *