Как повысить качество фотографий, сделанных с помощью CameraManager
Сравнение очень простое: я делаю фотографию с помощью пользовательской камеры, которая использует 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 (остается) - 1,6 МБ. Таким образом, даже при большем размере фотография, сделанная с помощью CameraManager, все еще имеет низкое качество. Любые идеи, как я мог бы решить эту проблему: Как сделать так, чтобы фотография, сделанная с помощью CameraManager, была такого же качества, что и фотография, сделанная с помощью приложения Camera по умолчанию, которое поставляется с Note 5?
2 ответа
Вот некоторые методы, когда мы работаем с Camer Manager, этот метод может вам помочь.
Приложение Android Camera кодирует фотографию в Intent, доставленную в onActivityResult(), в виде небольшого растрового изображения в дополнительных элементах под ключом "данные". Следующий код извлекает это изображение и отображает его в ImageView.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && 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);
}
Я думаю, что качество в приложении Samsung стоковой камеры лучше, потому что оно использует Samsung Camera SDK. Это расширение Camera2 API.
SDK предоставляет полезные дополнительные функции (например, Phase-Autofocus). Попробуйте также включить оптическую стабилизацию объектива.