Есть ли какой-нибудь класс (CaptureProcessor?), Который позаботится об обрезке снятого изображения?
Вы можете установить соотношение сторон обрезки после построения сценария использования ImageCapture, используя метод setCropAspectRatio(Rational)
. Этот метод обрезает центр повернутого выходного изображения. Так что в основном то, что вы получите после вызова takePicture()
, - это то, о чем я думаю, вы просите.
Должен ли я даже использовать ImageAnalysis.Analyzer, если я не выполняю обработку в реальном времени и выполняю постобработка?
Нет, это не имеет смысла в вашем сценарии. Как вы упомянули, только при обработке изображений в реальном времени вы захотите использовать ImageAnalysis.Analyzer
.
ps: мне было бы интересно увидеть код, который вы используете для takePicture()
, который вызвал IllegalStateException
,
[Редактировать]
Взгляните на ваш код
imageCapture?.takePicture(executor, object : ImageCapture.OnImageCapturedCallback() {
override fun onCaptureSuccess(image: ImageProxy) {
// 1
super.onCaptureSuccess(image)
// 2
Log.d("MainActivity", "Image captured: ${image.width}x${image.height}")
}
})
В (1), если вы посмотрите на реализацию super.onCaptureSuccess(imageProxy)
, это на самом деле закрывает imageProxy, переданный методу. Доступ к ширине и высоте изображения в (2) вызывает исключение, которое является нормальным, так как изображение было закрыто. Документация гласит:
Приложение отвечает за вызов ImageProxy.close () для закрытия изображения.
Так что при использовании этого обратного вызова вам, вероятно, не следует вызывать super...
, просто используйте imageProxy, затем, прежде чем вернуться из метода, закройте его вручную (ImageProxy.close()
).