Skip to content

Instantly share code, notes, and snippets.

@msdx
Created January 8, 2016 05:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save msdx/8951e421ae963f34c839 to your computer and use it in GitHub Desktop.
Save msdx/8951e421ae963f34c839 to your computer and use it in GitHub Desktop.
set pictureSize and previewSize
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