gpt4 book ai didi

android - 如何在 Android 中从 ImageView 中的相机显示中获取图像而不损失其质量?

转载 作者:行者123 更新时间:2023-12-02 14:32:40 25 4
gpt4 key购买 nike

我使用这个简单的代码从相机捕获图像。我发现这个问题很多并且尝试了很多方法但无法解决这个问题。当我捕获图像时,我的图像大部分是 PDF,由于像素较差,它变得不可读

 private static final int CAMERA_REQUEST = 1888;
private ImageView imageView;
private static final int MY_CAMERA_PERMISSION_CODE = 100;
ImageView Image;


private static final int REQUEST_CAPTURE_IMAGE = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_test);
Image = (ImageView) findViewById(R.id.Image);
Button camera = (Button) findViewById(R.id.camera);
camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
{
requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_PERMISSION_CODE);
}
else
{
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
}
}

});



}




@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_CAMERA_PERMISSION_CODE)
{
if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
Toast.makeText(this, "camera permission granted", Toast.LENGTH_LONG).show();
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
else
{
Toast.makeText(this, "camera permission denied", Toast.LENGTH_LONG).show();
}
}
}




@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK)
{
Bitmap photo = (Bitmap) data.getExtras().get("data");
Image.setImageBitmap(photo);
}
}

我使用这个简单的代码从相机捕获图像。我发现这个问题很多并且尝试了很多方法但无法解决这个问题。当我捕获图像时,我的图像大部分是 PDF,由于像素较差,它变得不可读

最佳答案

如果您需要最佳质量的图像,则需要将其保存到文件中,否则您只能访问缩略图(低分辨率图像)。我将分享我是如何做到的。

在 list 中,您需要在应用程序标记内定义文件提供程序以及权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<application...>
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="{your package name}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_path" />
</provider>
</application>

您还需要在 res/xml 文件夹中创建一个 FileProvider。我的看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="/storage/emulated/0/Pictures/" path="Pictures/"/>
</paths>

请多做研究,您想将照片保存在哪里,在我的示例中,您只能将它们保存到 SD 卡,但还有更多选项。

现在,拍照并保存。

private var currentPhotoUri = Uri.EMPTY
private var currentPhotoPath
private val requestCode = 123

private fun dispatchTakePictureIntent() {
Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
// Ensure that there's a camera activity to handle the intent
takePictureIntent.resolveActivity(activity?.packageManager!!)?.also {

createFile()

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, currentFileUri)
startActivityForResult(takePictureIntent, requestCode)
}
}
}

private fun createFile(): File? {
val photoFile: File? = try {
createImageFile()
} catch (ex: IOException) {
Log.i("mylog error", "Error creating file: " + ex.toString())
ex.printStackTrace()
null
}
// Continue only if the File was successfully created
photoFile?.also {
val photoURI: Uri = context?.let { context ->
FileProvider.getUriForFile(
context,
"{your package name}.fileprovider",
it
)
} as Uri
currentPhotoUri = photoURI

}
return photoFile
}

private fun createImageFile(): File {
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
val storageDir: File? = context!!.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
Log.i("mylog", "storage dir = " + storageDir?.absolutePath)
return File.createTempFile(
"JPEG_${timeStamp}_", /* prefix */
".jpg", /* suffix */
storageDir /* directory */
).apply {
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = absolutePath
}

}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent)
{
if (requestCode == requestCode && resultCode == RESULT_OK) {
val bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),currentPhotoUri)
val imageView = findViewById(R.id.Image)
imageView.setImageBitmap(bitmap)
}
}

这应该有效。不要忘记检查权限。您可以了解更多here .

关于android - 如何在 Android 中从 ImageView 中的相机显示中获取图像而不损失其质量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58744169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com