如何在ImageView中从相机放映中获取图像而又不损失其在Android中的质量?

穆罕默德·哈姆扎·伊什蒂亚克

我使用此简单代码从相机捕获图像。我已经找到很多这个问题,并尝试了许多方法,但无法解决此问题。捕获时,我的图像大部分为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,由于像素变差而无法读取

乌罗斯·科科维奇

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

在清单中,您需要在应用程序标记和权限中定义文件提供程序。

<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)
    }
}

那应该工作。不要忘记检查权限。您可以在此处了解更多信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我必须压缩PNG文件图像,而又不损失质量

如何在<div>中调整背景图像的亮度而又不影响前景项目?

如何在swtableviewcell中执行滑动动作而又不移动图像

如何在Ubuntu上将视频缩放到3.5:1而又不损失质量?

如何在脚本中减少使用而又不获取ESC转义字符?

在Android中减小图片大小而不损失其质量

如何在C ++或OpenCV中调整图像大小而不损失图像质量

如何在blazor组件中过滤通用列表参数而又不知道其属性名称和类型

如何在Android中获取ImageView的图像名称?

如何在Facebook帖子中添加图片而又不在Feed中获取图片两次?

如何在android中从画廊和相机点击特定imageView上传特定图像

Android从相机在imageview中显示图像

如何从数组中删除特定元素,而又不删除其以后出现的情况

如何在ImageView中闪烁图像(Android)

如何在Android中获取ImageView资源

要处理有理数而又不损失Matlab中的计算精度?

如何在C ++中返回对象而又不会超出范围?

如何在T SQL中对XML进行编码而又不增加XML开销

如何在Anaconda中卸载pip ipykernel而又不卸载ipykernel?

如何在FlatList中更改单个图标的颜色而又不同时更改它们的颜色

如何在Windows中通过命令行退出Firefox而又不强制退出?

如何在角度7中从阵列拼接元素而又不干扰主阵列

如何在dplyr中对许多列进行突变而又不重复多次?

如何在Haskell中旋转OpenGL图形而又不重新评估图形对象?

如何在列中输入一组值,而又不更改预先存在的条目?

如何在droid中制作拼图应用而又不会耗尽内存?

如何在悬停时增加边框宽度而又不移走CSS中的div位置?

如何在Swift 4中使用Swift搜索到先前的屏幕而又不丢失数据

如何在熊猫中编辑姓氏,名字的顺序而又不丢失数据框