Created
January 8, 2016 05:47
-
-
Save msdx/8951e421ae963f34c839 to your computer and use it in GitHub Desktop.
set pictureSize and previewSize
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private void openCamera() { | |
if (mCamera == null) { | |
try { | |
mCamera = Camera.open(); | |
} catch (RuntimeException e) { | |
mCamera = null; | |
} | |
} | |
if (mCamera == null) { | |
MessageProxy.showError(this, R.string.msg_camera_invalid); | |
finish(); | |
return; | |
} | |
final Camera.Parameters cameraParams = mCamera.getParameters(); | |
cameraParams.setPictureFormat(ImageFormat.JPEG); | |
cameraParams.setRotation(90); | |
cameraParams.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); | |
mCamera.setParameters(cameraParams); | |
// 短边比长边 | |
final float ratio = (float) mSurfaceView.getWidth() / mSurfaceView.getHeight(); | |
// 设置pictureSize | |
List<Camera.Size> pictureSizes = cameraParams.getSupportedPictureSizes(); | |
if (mBestPictureSize == null) { | |
mBestPictureSize =findBestPictureSize(pictureSizes, cameraParams.getPictureSize(), ratio); | |
} | |
final Camera.Size pictureSize = mBestPictureSize; | |
cameraParams.setPictureSize(pictureSize.width, pictureSize.height); | |
// 设置previewSize | |
List<Camera.Size> previewSizes = cameraParams.getSupportedPreviewSizes(); | |
if (mBestPreviewSize == null) { | |
mBestPreviewSize = findBestPreviewSize(previewSizes, cameraParams.getPreviewSize(), | |
pictureSize, ratio); | |
} | |
final Camera.Size previewSize = mBestPreviewSize; | |
cameraParams.setPreviewSize(previewSize.width, previewSize.height); | |
setSurfaceViewSize(previewSize); | |
try { | |
mCamera.setParameters(cameraParams); | |
} catch (RuntimeException e) { | |
reportBug(cameraParams, e); | |
} | |
if (mIsSurfaceReady) { | |
startPreview(); | |
} | |
} | |
private void reportBug(Camera.Parameters cameraParams, RuntimeException e) { | |
final List<Camera.Size> pictureSizes = cameraParams.getSupportedPictureSizes(); | |
final List<Camera.Size> previewSizes = cameraParams.getSupportedPreviewSizes(); | |
final StringBuilder sb = new StringBuilder(); | |
sb.append("surface[").append(mSurfaceView.getWidth()).append(",").append(mSurfaceView.getHeight()).append("]\n"); | |
buildSizesLog("picture", pictureSizes, sb); | |
buildSizesLog("preview", previewSizes, sb); | |
BugReport.report(new Exception("无法匹配合适大小:" + sb.toString(), e)); | |
} | |
private void buildSizesLog(String tag, List<Camera.Size> sizes, StringBuilder sb) { | |
sb.append(tag).append("{"); | |
for(Camera.Size size : sizes) { | |
sb.append("[").append(size.width).append(",").append(size.height).append("],"); | |
} | |
sb.deleteCharAt(sb.length() - 1); | |
sb.append("}\n"); | |
} | |
private void setSurfaceViewSize(Camera.Size size) { | |
ViewGroup.LayoutParams params = mSurfaceView.getLayoutParams(); | |
params.height = mSurfaceView.getWidth() * size.width / size.height; | |
mSurfaceView.setLayoutParams(params); | |
} | |
/** | |
* 找到短边比长边大于于所接受的最小比例的最大尺寸 | |
* | |
* @param sizes 支持的尺寸列表 | |
* @param defaultSize 默认大小 | |
* @param minRatio 相机图片短边比长边所接受的最小比例 | |
* @return 返回计算之后的尺寸 | |
*/ | |
private Camera.Size findBestPictureSize(List<Camera.Size> sizes, Camera.Size defaultSize, float minRatio) { | |
final int MIN_PIXELS = 320 * 480; | |
sortSizes(sizes); | |
Iterator<Camera.Size> it = sizes.iterator(); | |
while (it.hasNext()) { | |
Camera.Size size = it.next(); | |
//移除不满足比例的尺寸 | |
if ((float) size.height / size.width <= minRatio) { | |
it.remove(); | |
continue; | |
} | |
//移除太小的尺寸 | |
if (size.width * size.height < MIN_PIXELS) { | |
it.remove(); | |
} | |
} | |
// 返回符合条件中最大尺寸的一个 | |
if (!sizes.isEmpty()) { | |
return sizes.get(0); | |
} | |
// 没得选,默认吧 | |
return defaultSize; | |
} | |
/** | |
* @param sizes | |
* @param defaultSize | |
* @param pictureSize 图片的大小 | |
* @param minRatio preview短边比长边所接受的最小比例 | |
* @return | |
*/ | |
private Camera.Size findBestPreviewSize(List<Camera.Size> sizes, Camera.Size defaultSize, | |
Camera.Size pictureSize, float minRatio) { | |
final int pictureWidth = pictureSize.width; | |
final int pictureHeight = pictureSize.height; | |
boolean isBestSize = (pictureHeight / (float)pictureWidth) > minRatio; | |
sortSizes(sizes); | |
Iterator<Camera.Size> it = sizes.iterator(); | |
while (it.hasNext()) { | |
Camera.Size size = it.next(); | |
if ((float) size.height / size.width <= minRatio) { | |
it.remove(); | |
continue; | |
} | |
// 找到同样的比例,直接返回 | |
if (isBestSize && size.width * pictureHeight == size.height * pictureWidth) { | |
return size; | |
} | |
} | |
// 未找到同样的比例的,返回尺寸最大的 | |
if (!sizes.isEmpty()) { | |
return sizes.get(0); | |
} | |
// 没得选,默认吧 | |
return defaultSize; | |
} | |
private static void sortSizes(List<Camera.Size> sizes) { | |
Collections.sort(sizes, new Comparator<Camera.Size>() { | |
@Override | |
public int compare(Camera.Size a, Camera.Size b) { | |
return b.height * b.width - a.height * a.width; | |
} | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment