Как повысить качество фотографий, сделанных с помощью CameraManager

#android #android-camera

#Android #android-камера

Вопрос:

Сравнение простое: я делаю снимок с помощью своей пользовательской камеры, которая использует CameraManager. Затем я делаю ту же фотографию с помощью камеры Galaxy Note 5 по умолчанию. Самый большой размер, доступный для CameraManager, 3264 by 1836 поэтому я использую его и устанавливаю камеру Samsung на то же разрешение. Результаты

  • Примечание 5: я могу видеть детали на фотографии
  • CameraManager: я не вижу деталей. Изображение низкого качества.

Затем я пытаюсь настроить фотографии CameraManager с помощью

  captureBuilder.set(CaptureRequest.JPEG_QUALITY, (byte) 100);
  

По-прежнему без изменений. Ну, только одно изменение: размер файла фотографии, сделанной с помощью CameraManager, становится 2,3 МБ (раньше было 0,5 МБ), в то время как размер Samsung photo (остается) 1,6 МБ. Таким образом, даже при большем размере фотография, сделанная с помощью CameraManager, по-прежнему имеет более низкое качество. Есть идеи, как я мог бы решить эту проблему: как мне сделать так, чтобы фотография, сделанная с помощью CameraManager, имела то же качество, что и фотография, сделанная с помощью приложения Camera по умолчанию, которое поставляется с Note 5?

Комментарии:

1. Также почему камера Samsung может достигать 5312x2088 , в то время как CameraManager сообщает максимум 3264 by 1836 ?

2. вы используете простой старый android.hardware.Camera класс?

3. Извините за задержку. Я использую android.hardware.camera2

4. ах, конечно, CameraManager — это camera2. Извините, я не знаком с этим API

5. Какие проблемы с качеством вы видите? Изображения, которые вы получаете в своем приложении, не в фокусе или, по крайней мере, не такие четкие, отличаются ли цвета, плохой ли динамический диапазон, видите ли вы артефакты сжатия? Рекомендации будут в значительной степени зависеть от того, какую именно проблему с качеством изображения вы наблюдаете.

Ответ №1:

Вот несколько методов, когда мы работаем над Camer manager, этот метод может вам помочь.

Приложение Android Camera кодирует фотографию в Intent, переданном onActivityResult(), в виде небольшого растрового изображения в дополнительных приложениях под ключом «данные». Следующий код извлекает это изображение и отображает его в режиме просмотра изображений.

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_IMAGE_CAPTURE amp;amp; resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            mImageView.setImageBitmap(imageBitmap);
        }
    }
    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_"   timeStamp   "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        mCurrentPhotoPath = "file:"   image.getAbsolutePath();
        return image;
    }
private void setPic() {
    // Get the dimensions of the View
    int targetW = mImageView.getWidth();
    int targetH = mImageView.getHeight();

    // Get the dimensions of the bitmap
    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
    int photoW = bmOptions.outWidth;
    int photoH = bmOptions.outHeight;

    // Determine how much to scale down the image
    int scaleFactor = Math.min(photoW/targetW, photoH/targetH);

    // Decode the image file into a Bitmap sized to fill the View
    bmOptions.inJustDecodeBounds = false;
    bmOptions.inSampleSize = scaleFactor;
    bmOptions.inPurgeable = true;

    Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
    mImageView.setImageBitmap(bitmap);
}
  

Ответ №2:

Я думаю, что качество в приложении Samsung Stock camera лучше, потому что оно использует Samsung Camera SDK. Это расширение Camera2 API.

SDK предоставляет полезные дополнительные функции (например, фазовую автофокусировку). Попробуйте также включить оптическую стабилизацию объектива.