- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用图像捕获中包含的叠加层来捕获图片。我能够将覆盖设置为 previewView
使用 cameraView.overlay.add(binding.textView)
.但是,当尝试使用 imageCapture
保存图像时,它没有保存。只有图片被保存而不是覆盖。如何使用 PreviewView
保存包含叠加层的图像相机 x。
请不要将此标记为重复。我研究了很多,大多数在线示例都使用旧的 camera
不适用于相机 x 库的 api。任何帮助表示赞赏。提前致谢。
这是我的代码
<FrameLayout
android:id="@+id/camera_wrapper"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="@id/space1"
app:layout_constraintBottom_toBottomOf="@id/space">
<androidx.camera.view.PreviewView
android:id="@+id/camera_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Hello world"
android:textSize="42sp"
android:textColor="@android:color/holo_green_dark"/>
</FrameLayout>
private lateinit var outputDirectory: File
private lateinit var cameraExecutor: ExecutorService
private var preview: Preview? = null
private var lensFacing: Int = CameraSelector.LENS_FACING_FRONT
private var imageCapture: ImageCapture? = null
private var camera: Camera? = null
private var cameraProvider: ProcessCameraProvider? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
outputDirectory = getOutputDirectory()
cameraExecutor = Executors.newSingleThreadExecutor()
}
private fun setupCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())
cameraProviderFuture.addListener(
Runnable {
// Used to bind the lifecycle of cameras to the lifecycle owner
cameraProvider = cameraProviderFuture.get()
// Get screen metrics used to setup camera for full screen resolution
val metrics = DisplayMetrics().also { binding.cameraView.display.getRealMetrics(it) }
Timber.d("Screen metrics: ${metrics.widthPixels} x ${metrics.heightPixels}")
val screenAspectRatio = aspectRatio(metrics.widthPixels, metrics.heightPixels)
Timber.d("Preview aspect ratio: $screenAspectRatio")
val rotation = binding.cameraView.display.rotation
// CameraProvider
val cameraProvider = cameraProvider
?: throw IllegalStateException("Camera initialization failed.")
// CameraSelector
val cameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
// add text overlay *---------*
binding.cameraView.overlay.add(binding.textView)
// Preview
preview = Preview.Builder()
// We request aspect ratio but no resolution
.setTargetAspectRatio(screenAspectRatio)
// Set initial target rotation
.setTargetRotation(rotation)
.build()
// ImageCapture
imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
// We request aspect ratio but no resolution to match preview config, but letting
// CameraX optimize for whatever specific resolution best fits our use cases
.setTargetAspectRatio(screenAspectRatio)
// Set initial target rotation, we will have to call this again if rotation changes
// during the lifecycle of this use case
.setTargetRotation(rotation)
.build()
// Must unbind the use-cases before rebinding them
cameraProvider.unbindAll()
try {
// A variable number of use-cases can be passed here -
// camera provides access to CameraControl & CameraInfo
camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture)
// Attach the viewfinder's surface provider to preview use case
preview?.setSurfaceProvider(binding.cameraView.surfaceProvider)
} catch (exc: Exception) {
Toast.makeText(requireContext(), "Something went wrong. Please try again.", Toast.LENGTH_SHORT).show()
findNavController().navigateUp()
}
},
ContextCompat.getMainExecutor(requireContext())
)
}
private fun takePhoto() {
imageCapture?.let { imageCapture ->
// Create output file to hold the image
val photoFile = createFile(outputDirectory, FILENAME, PHOTO_EXTENSION)
// Setup image capture metadata
val metadata = ImageCapture.Metadata().apply {
// Mirror image when using the front camera
isReversedHorizontal = lensFacing == CameraSelector.LENS_FACING_FRONT
}
// Create output options object which contains file + metadata
val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile)
.setMetadata(metadata)
.build()
// Setup image capture listener which is triggered after photo has been taken
imageCapture.takePicture(outputOptions, cameraExecutor, object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
Timber.e(exc, "Photo capture failed: ${exc.message}")
}
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
val savedUri = output.savedUri ?: Uri.fromFile(photoFile)
Timber.d("Photo capture succeeded: $savedUri")
// Implicit broadcasts will be ignored for devices running API level >= 24
// so if you only target API level 24+ you can remove this statement
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
requireActivity()
.sendBroadcast(Intent(android.hardware.Camera.ACTION_NEW_PICTURE, savedUri))
}
// If the folder selected is an external media directory, this is
// unnecessary but otherwise other apps will not be able to access our
// images unless we scan them using [MediaScannerConnection]
val mimeType = MimeTypeMap.getSingleton()
.getMimeTypeFromExtension(savedUri.toFile().extension)
MediaScannerConnection.scanFile(
context,
arrayOf(savedUri.toFile().absolutePath),
arrayOf(mimeType)
) { _, uri ->
Timber.d("Image capture scanned into media store: $uri")
}
}
})
}
}
最佳答案
您必须自己将文本覆盖在图像上。我建议使用 takePicture(Executor, …)将 Jpeg 放入内存中;然后,使用其中一个库(不是 Android 框架的一部分,也不是 Jetpack 的一部分)覆盖您的文本,并将结果保存在文件中。
如果您可以在图像质量上妥协,您可以在位图 Canvas 上绘制 Jpeg,然后在顶部绘制文本。
关于android - 使用 cameraX 的 PreviewView 捕获叠加层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64903838/
我正在制作一个应用程序,其中有两个文件 CameraVC.swift import UIKit class CameraVC: CameraViewController { @IBOutlet wea
我正在尝试使用 androidx.camera 包创建一个按需功能模块。当 Activity 使包含 PreviewView 的布局膨胀时,我遇到了崩溃。请注意,如果我只使用像 TextView 这样
我有一个 PreviewView 实例,我想根据使用 Firebase 和 Image Analyzer 用例的对象标识在该实例上绘制一个矩形。 但是,与 Text/SurfaceView 不同,Pr
我遵循了这些教程: https://developer.android.com/training/camerax/preview , https://proandroiddev.com/update-
camerax cameraView 和 previewView 有什么区别?因为我找不到关于比较 2 个 View 以预览 camerax 的资源或文章 最佳答案 PreviewView 是一个自定
免责声明:我知道 this question 的存在,但它目前仍未解决,我正在尝试提供额外的信息,而不是用无论如何都无法解决问题的无用答案污染那个信息。 我有一个带有默认镜像的前置摄像头的自定义设备,
谁能告诉我如何在cameraX预览上绘制一个矩形?我尝试按照过去用 kotlin 编写的堆栈溢出答案的建议实现自定义 View ,但是当我尝试将其转换为 Java 时,它似乎对我不起作用。 XML 文
我是 Andriod 的初学者,现在遇到问题。 如何使用 CameraX 和 ZXing 创建 QR 码扫描仪在 here 中进行了描述。和 here 。我正在尝试制作一个示例项目。 但是我的代码有错
我试图使用 CameraX PreviewView Composable 的内部通过 AndroidView ,但预览被拉伸(stretch),右半部分被剪裁,正如您在 screenshot 中看到的
我有一个简单的设置: preview = new Preview.Builder().build(); preview.setSurfaceProvider(mPreviewView.createSu
我正在尝试使用图像捕获中包含的叠加层来捕获图片。我能够将覆盖设置为 previewView使用 cameraView.overlay.add(binding.textView) .但是,当尝试使用 i
我正在尝试通过动画实现效果,但只有在预览 View 处于 Activity 状态后才能实现。原因之一也是为了避免相机绑定(bind)后出现闪烁。 我已经设法使用反射 (androidx.camera.
我有一个 PreviewView除了工具栏外,它占据了整个屏幕。 相机的预览效果很好,但是当我捕捉图像时,纵横比完全不同。 我想在成功捕获图像后将图像显示给用户,因此它与 PreviewView 的大
这是我的代码,我遇到了错误。请检查并告诉我如何解决这个问题。 func mapView(_ mapView: GMSMapView, markerInfoContents marker: GMSMar
我想在没有任何 xml 和 PreviewView 或其他显示图片的情况下使用 CameraX 拍照,但我有问题。 最佳答案 你应该使用Camera2,这个问题是错误的 关于android - 如何在
我正在使用 Google 的 API2 相机,但我的代码遇到了一些问题。我有两个不同的 CameraSession,一个用于视频,另一个用于图像。为了更高效地执行此操作,我更改了代码以使用唯一的 Se
我是一名优秀的程序员,十分优秀!