多种方法获取相机最佳尺寸

方法一:

/**
     * 通过对比得到与宽高比最接近的尺寸(如果有相同尺寸,优先选择)
     *
     * @param surfaceWidth
     *            需要被进行对比的原宽
     * @param surfaceHeight
     *            需要被进行对比的原高
     * @param preSizeList
     *            需要对比的预览尺寸列表
     * @return 得到与原宽高比例最接近的尺寸
     */
    protected Camera.Size getCloselyPreSize(int surfaceWidth, int surfaceHeight,
                                            List<Camera.Size> preSizeList) {

        int ReqTmpWidth;
        int ReqTmpHeight;
        // 当屏幕为垂直的时候需要把宽高值进行调换,保证宽大于高
//        if (mIsPortrait) {
//            ReqTmpWidth = surfaceHeight;
//            ReqTmpHeight = surfaceWidth;
//        } else {
            ReqTmpWidth = surfaceWidth;
            ReqTmpHeight = surfaceHeight;
//        }
        //先查找preview中是否存在与surfaceview相同宽高的尺寸
        for(Camera.Size size : preSizeList){
            if((size.width == ReqTmpWidth) && (size.height == ReqTmpHeight)){
                return size;
            }
        }

        // 得到与传入的宽高比最接近的size
        float reqRatio = ((float) ReqTmpWidth) / ReqTmpHeight;
        float curRatio, deltaRatio;
        float deltaRatioMin = Float.MAX_VALUE;
        Camera.Size retSize = null;
        for (Camera.Size size : preSizeList) {
            curRatio = ((float) size.width) / size.height;
            deltaRatio = Math.abs(reqRatio - curRatio);
            if (deltaRatio < deltaRatioMin) {
                deltaRatioMin = deltaRatio;
                retSize = size;
            }
        }

        return retSize;
    }
调用:

List<Camera.Size> mSupportedPreviewSizes = mCamera.getParameters().getSupportedPictureSizes();
            Camera.Size bestSize = getCloselyPreSize(1000,740,mSupportedPreviewSizes);
            mWidth = bestSize.width;
            mHeight = bestSize.height;

获取到的尺寸虽然不怎么变形,但很模糊。


方法二:

private int getPictureSize(List<Camera.Size> sizes) {
    // 屏幕的宽度
    int screenWidth = getResources().getDisplayMetrics().widthPixels;
    LogUtil.d(TAG, "screenWidth=" + screenWidth);
    int index = -1;


    for (int i = 0; i < sizes.size(); i++) {
        if (screenWidth == sizes.get(i).width) {
            index = i;
        }
    }
    // 当未找到与手机分辨率相等的数值,取列表中间的分辨率
    if (index == -1) {
        index = sizes.size() / 2;
    }


    return index;
}
放在宽度为1000,高度为740的surfaceView里,会变形。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值