今天我們講一下如何獲得並設置相機分辨率的問題,算是技術貼,也算知識掃盲貼。
有很多網友會問,為什麼我的相機設置分辨率沒效果啊?
首先,做相機程序,必須要硬件支持!如開啟聲音、分辨率設置、對焦等功能。
如果說不支持就得到不到想到的效果,如很多相機程序可以設置分辨率,但感覺不成功,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.2cto.com
bos.close();// 關閉
歡迎大家踴躍交流!
博客出自:http://blog.csdn.net/liuxian13183