Поддерживаемые размеры поддерживаемых камер Android

Я пытаюсь получить доступные размеры изображения камеры, поэтому я могу настроить камеру на предпочтительное разрешение изображения.

Чтобы получить размер камеры Android, я использовал следующий код:

camera=Camera.open();
Parameters params = camera.getParameters();
List sizes = params.getSupportedPictureSizes();
for (int i=0;i<sizes.size();i++){
    Log.i("PictureSize", "Supported Size: " +sizes.get(i));         
}

Это дает мне следующий результат, который я не уверен, как преобразовать в размер.

"Supported size: [email protected]"
"Supported size: [email protected]"
"Supported size: [email protected]"
"Supported size: [email protected]"
"Supported size: [email protected]"
"Supported size: [email protected]"

Если бы кто-нибудь мог помочь мне понять результат, это мне очень помогло, спасибо!

Изменить: я решил решить свою проблему, выполнив следующие действия:

camera=Camera.open();
Parameters params = camera.getParameters();
List sizes = params.getSupportedPictureSizes();
Camera.Size result = null;
    for (int i=0;i<sizes.size();i++){
        result = (Size) sizes.get(i);
        Log.i("PictureSize", "Supported Size. Width: " + result.width + "height : " + result.height); 
    }

Ответ 1

getSupportedPictureSizes() возвращает List объектов Camera.Size. Camera.Size имеет элементы height и width, которые сообщают вам о высоте и ширине поддерживаемого размера изображения.

Вот пример проекта, который использует связанный getSupportedPreviewSizes(), чтобы найти размер предварительного просмотра с наибольшей площадью, которая меньше размера SurfaceView.

Ответ 2

Camera camera = Camera.open();
Parameters params = camera.getParameters();
List sizes = params.getSupportedPictureSizes();
for (int i=0;i<sizes.size();i++) {
    Log.i("PictureSize", "Supported Size: " +sizes.get(i).width + "height : " + sizes.get(i).height);     
}   

Вы должны брать высоту и ширину от одного объекта размера

Ответ 3

Вот пример того, как искать размер, который aprroaching максимальный размер (1024 * 768), например.

                List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
                //searches for good picture quality
                Camera.Size bestDimens = null;
                for(Camera.Size dimens : sizes){
                    if(dimens.width  <= 1024 && dimens.height <= 768){
                        if (bestDimens == null || (dimens.width > bestDimens.width && dimens.height > bestDimens.height)) {
                            bestDimens = dimens;
                        }
                    }
                }
                parameters.setPictureSize(bestDimens.width, bestDimens.height);
                camera.setParameters(parameters);

Ответ 4

Это то, что я закончил делать. Поскольку метод params.getSupportedPictureSizes() возвращает список типа Camera.Size, это было легко сделать:

        List<Camera.Size> sizes = p.getSupportedPictureSizes();

        //searches for good picture quality
        for(Camera.Size dimens : sizes){
            if(dimens.width  <= 1024 && dimens.height <= 768){
                Debug.WriteLine("Width: " + dimens.width + " Height: " + dimens.height);
                return dimens;
            }
        }

        Debug.WriteLine("Width: " + sizes.get(sizes.size()-1).width + " Height: " + sizes.get(sizes.size()-1).height);
        //returns the smallest camera size if worst comes to worst
        return p.getSupportedPictureSizes().get(sizes.size()-1);

Вы можете получить List<Camera.Size> и пересечь его, как и любой другой список. объект Camera.Size имеет свойство width и height.

Объявление вашего List таким образом может быть лучше, чем лить каждый элемент списка, чтобы набрать Camera.Size внутри цикла.

На моих устройствах, если я посмотрю sizes.get(0), он будет иметь самое высокое разрешение, а sizes.get( sizes.size()-1 ) - самое низкое. Однако я не уверен, что это верно для всех устройств. Кто-нибудь знает об этом?