Качество предварительного просмотра камеры в Android плохое

Я делаю приложение для камеры в Android и использовал следующую функцию, чтобы получить размер предварительного просмотра:

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { final double ASPECT_TOLERANCE = 0.1; double targetRatio = (double) w / h; if (sizes == null) return null; Size optimalSize = null; double minDiff = Double.MAX_VALUE; int targetHeight = h; // Try to find an size match aspect ratio and size for (Size size : sizes) { double ratio = (double) size.width / size.height; if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } // Cannot find the one match the aspect ratio, ignore the requirement if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Size size : sizes) { if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } } return optimalSize; } 

И я установил размер следующим образом:

 Size s = getOptimalPreviewSize(parameters.getSupportedPreviewSizes(), w, h); parameters.setPreviewSize(s.width, s.height); 

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

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

ПРИМЕЧАНИЕ. Функция получения размера предварительного просмотра взята из примеров программ из Android Docs.

Этот алгоритм не самый большой.

Алгоритм по умолчанию в моей библиотеке CWAC-Camera теперь:

  public static Camera.Size getBestAspectPreviewSize(int displayOrientation, int width, int height, Camera.Parameters parameters, double closeEnough) { double targetRatio=(double)width / height; Camera.Size optimalSize=null; double minDiff=Double.MAX_VALUE; if (displayOrientation == 90 || displayOrientation == 270) { targetRatio=(double)height / width; } List<Size> sizes=parameters.getSupportedPreviewSizes(); Collections.sort(sizes, Collections.reverseOrder(new SizeComparator())); for (Size size : sizes) { double ratio=(double)size.width / size.height; if (Math.abs(ratio - targetRatio) < minDiff) { optimalSize=size; minDiff=Math.abs(ratio - targetRatio); } if (minDiff < closeEnough) { break; } } return(optimalSize); } 

Эта:

  • Принимает во внимание портрет и пейзаж

  • Начинается с предварительного просмотра с высоким разрешением и работает вниз

  • Может быть адаптировано с помощью closeEnough чтобы выбрать более высокое разрешение, в отличие от наилучшего соответствия пропорциям области предварительного просмотра

Intereting Posts
Android-обратный тэдж для Android: как обмануть приложения Java.lang.IllegalArgumentException: наблюдатель имеет значение null Как установить значение по умолчанию для SwitchPreference в android? Pdf библиотека для Android? Как включить амперсанды в URL-адресах для запуска adb shell? Есть ли способ обновить несколько TextView с помощью ArrayAdapter? Дополнительные приложения WidgetProvider Intent, отправленные с нажатием кнопки, не найдены в onReceive Я должен дважды нажать кнопку, чтобы она работала Android Spinner: Получить выбранное событие изменения элемента Только Android 4.1, Bitmap автоматически перерабатывается Android – как получить уведомление при завершении синхронизации при запросе синхронизации с ContentResolver.requestSync () Аннотацию Android для вызова определенной функции Как извлекать переменные «? Var = value» из веб-url, который открывает активность в моем приложении? Какие системные изображения следует установить для Android L Developement? Android AlertDialog – цвет фона заголовка