Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Camera X ImageAnalysis图像平面缓冲区大小(限制)与图像大小不匹配 问题_Java_Android_Kotlin_Android Camerax - Fatal编程技术网

Java Android Camera X ImageAnalysis图像平面缓冲区大小(限制)与图像大小不匹配 问题

Java Android Camera X ImageAnalysis图像平面缓冲区大小(限制)与图像大小不匹配 问题,java,android,kotlin,android-camerax,Java,Android,Kotlin,Android Camerax,这是一个关于camera-x的ImageAnalysis用例的一般性问题,但我将使用稍微修改的版本作为示例来说明我看到的问题。我发现图像尺寸(image.height*image.width)和相关的ByteBuffer大小(通过其限制和/或容量测量)不匹配。我希望它们是相同的,并且将图像的一个像素映射到ByteBuffer中的单个值。情况似乎并非如此。希望有人能澄清这是否是一个bug,如果不是,如何解释这种不匹配 细节 在codelab的步骤6(图像分析)中,他们为光度分析器提供了一个子类:

这是一个关于camera-x的ImageAnalysis用例的一般性问题,但我将使用稍微修改的版本作为示例来说明我看到的问题。我发现图像尺寸(image.height*image.width)和相关的ByteBuffer大小(通过其限制和/或容量测量)不匹配。我希望它们是相同的,并且将图像的一个像素映射到ByteBuffer中的单个值。情况似乎并非如此。希望有人能澄清这是否是一个bug,如果不是,如何解释这种不匹配

细节 在codelab的步骤6(图像分析)中,他们为光度分析器提供了一个子类:

包jp.oist.cameraxcodelab
导入androidx.appcompat.app.appcompat活动
导入android.os.Bundle
导入android.Manifest
导入android.content.pm.PackageManager
导入android.net.Uri
导入android.util.Log
导入android.util.Size
导入android.widget.Toast
导入androidx.core.app.ActivityCompat
导入androidx.core.content.ContextCompat
导入java.util.concurrent.Executors
导入androidx.camera.core*
导入androidx.camera.lifecycle.ProcessCameraProvider
导入kotlinx.android.synthetic.main.activity\u main*
导入java.io.xml文件
导入java.nio.ByteBuffer
导入java.text.simpleDataFormat
导入java.util*
导入java.util.concurrent.ExecutorService
typealias LumaListener=(luma:Double)->单位
类MainActivity:AppCompatActivity(){
私有变量imageCapture:imageCapture?=null
私有lateinit var输出目录:文件
私有lateinit var cameraExecutor:ExecutorService
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//请求相机权限
如果(allPermissionsGranted()){
startCamera()
}否则{
ActivityCompat.requestPermissions(
此,所需权限,请求代码权限)
}
//设置“拍摄照片”按钮的侦听器
camera_capture_button.setOnClickListener{takePhoto()}
outputDirectory=getOutputDirectory()
cameraExecutor=Executors.newSingleThreadExecutor()
}
私人娱乐照{
//获取可修改图像捕获用例的稳定参考
val imageCapture=imageCapture?:返回
//创建带有时间戳的输出文件以保存图像
val photoFile=File(
输出目录,
SimpleDataFormat(文件名\u格式,Locale.US
).format(System.currentTimeMillis())+“.jpg”)
//创建包含文件+元数据的输出选项对象
val outputOptions=ImageCapture.OutputFileOptions.Builder(photoFile.build())
//设置图像捕获监听器,该监听器在照片显示后触发
//被带走
拍照(
outputOptions,ContextCompat.getMainExecutor(this),对象:ImageCapture.OnImageSavedCallback{
覆盖错误(exc:ImageCaptureException){
Log.e(标记“照片捕获失败:${exc.message}”,exc)
}
覆盖已保存的图像(输出:ImageCapture.OutputFileResults){
val savedUri=Uri.fromFile(照片文件)
val msg=“照片捕获成功:$savedUri”
Toast.makeText(baseContext、msg、Toast.LENGTH\u SHORT).show()
Log.d(标签、消息)
}
})
}
私人娱乐星空(){
val cameraProviderFuture=ProcessCameraProvider.getInstance(此)
cameraProviderFuture.addListener(可运行{
//用于将相机的生命周期绑定到生命周期所有者
val cameraProvider:ProcessCameraProvider=cameraProviderFuture.get()
//预演
val preview=preview.Builder()
.build()
.还有{
it.setSurfaceProvider(viewFinder.createSurfaceProvider())
}
imageCapture=imageCapture.Builder()
.build()
val imageAnalyzer=ImageAnalysis.Builder()
.setTargetResolution(大小(480640))//我添加了此行
.build()
.还有{
it.setAnalyzer(摄像机执行器,光度分析器{luma->
//Log.d(标签,“平均亮度:$luma”)
})
}
//选择back camera作为默认设置
val cameraSelector=cameraSelector.DEFAULT\u BACK\u摄像机
试一试{
//在重新绑定之前解除绑定用例
cameraProvider.unbindAll()
//将用例绑定到摄影机
cameraProvider.bindToLifecycle(
此选项、摄影机选择器、预览、图像捕获、图像分析器)
}捕获(exc:异常){
Log.e(标记“用例绑定失败”,exc)
}
},ContextCompat.getMainExecutor(此))
}
private fun allPermissionsGranted()=必需的权限。全部{
ContextCompat.checkSelfPermission(
baseContext,it)=PackageManager.PERMISSION\u已授予
}
私有的getOutputDirectory():文件{
val mediaDir=externalMediaDirs.firstOrNull()?.let{
文件(it,resources.getString(R.string.app_name)).apply{mkdirs()}
如果(mediaDir!=null&&mediaDir.exists())存在,则返回
mediaDir文件目录
}
重写onDestroy(){
super.ondestory()
cameraExecutor.shutdown()
}
伴星{
private const val TAG=“CameraXBasic”
private const val FILENAME_FORMAT=“yyyy MM dd HH MM ss SSS”
私有const val请求\代码\权限=10
普里夫
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "jp.oist.cameraxcodelab"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {

    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.2.0'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.2.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    def camerax_version = "1.0.0-beta07"
// CameraX core library using camera2 implementation
    implementation "androidx.camera:camera-camera2:$camerax_version"
// CameraX Lifecycle Library
    implementation "androidx.camera:camera-lifecycle:$camerax_version"
// CameraX View class
    implementation "androidx.camera:camera-view:1.0.0-alpha14"

}