Android相机拍照后,对照片模糊的处理;对照片旋转90度的处理

本文介绍了解决Android应用中拍照后图片模糊和自动旋转90度的问题。通过区分不同Android版本的处理方式,实现拍照图片的正确显示,并提供了解决方案的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发时我调用,调起相机进行拍照。

Intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, REQUEST_TAKEPHOTO)

随后用onActivityResult接收所得到的照片。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode==Activity.RESULT_OK){
            if (requestCode==REQUEST_TAKEPHOTO){
                val bundle: Bundle? =data?.extras
                val bitmap: Bitmap = bundle?.get("data") as Bitmap
                show(bitmap)
            }
        }
    }

这上面的做法都没毛病,但是我发现得到的图片非常模糊,实锤座机拍出来的。
后来才知道用bundle?.get(“data”)得到的Bitmap是缩略图,所以照片看上去非常的模糊。

如何解决呢?

解决思路:我们需要将拍照得到的图片先存储在本地,取值的时候,我们调取本地存储的文件作为显示,这时所显示的照片则是清晰的。

具体解决方案:

1.调起拍照

需要区分Android7.0以上,以及Android7.0以下的拍照调用(如果你是7.0的手机,直接调用7.0以下的方式,会直接crash报错。错误我忘记记录了,有兴趣的可以自己动手试一下)

判断系统版本,随后区分调取方法

var mFilePath = "yourPath.jpg"
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){
    takePhotoBiggerThan7(File(mFilePath).absolutePath)
}else{
    takePhotoLow7()
}
1.1 对7.0及以上的处理:
	/**
     * 7.0对照片的处理
     */
    private fun takePhotoBiggerThan7(absolutePath: String) {
        val mCameraTempUri: Uri?
        try {
            val values = ContentValues(1)
            values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg")
            values.put(MediaStore.Images.Media.DATA, absolutePath)
            mCameraTempUri = contentResolver.insert(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                values
            )
            val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
            if (mCameraTempUri != null) {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, mCameraTempUri)
                intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1)
            }
            startActivityForResult(intent, REQUEST_TAKEPHOTO)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
1.2 对7.0以下的处理:
private fun takePhotoLow7(){
        intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        mFilePath = "yourPath.jpg" //YourPath.jpg是你自己所需要保存的文件的路径地址
        val mUri = Uri.fromFile(File(mFilePath))
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mUri)
        startActivityForResult(intent, REQUEST_TAKEPHOTO)
}
2.对onActivity的处理(很多手机拍照后会被旋转90度,需要另作处理):
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode==Activity.RESULT_OK){
            if (requestCode==REQUEST_TAKEPHOTO){
            	//读取旋转照片的度数
                val angle = PhotoUtil.readPictureDegree(mFilePath)
                val bitmapori = BitmapFactory.decodeFile(mFilePath)
                //修复照片的旋转
                val bitmap = PhotoUtil.rotaingImageView(angle, bitmapori)
            }
        }
    }

执行了如上的方法,很多手机已经能够顺利的调起相机,并且能够得到清晰的照片。巧了的是,我的手机是三星的,得到的bitmap被旋转了90度。一波还未平息,一波又起了。那怎么办?那接下来就是对部分品牌手机,照片自动旋转90度的问题做处理了。

得到的照片,旋转了90度?

解决如下:

1.读取该相片被旋转的度数
fun readPictureDegree(path: String?): Int {
            var degree = 0
            try {
                val exifInterface = path?.let { ExifInterface(it) }
                val orientation: Int = exifInterface!!.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_NORMAL
                )
                //Log.e("TAG", "原图被旋转角度: ========== $orientation")
                when (orientation) {
                    ExifInterface.ORIENTATION_ROTATE_90 -> degree = 90
                    ExifInterface.ORIENTATION_ROTATE_180 -> degree = 180
                    ExifInterface.ORIENTATION_ROTATE_270 -> degree = 270
                }
            } catch (e: IOException) {
                e.printStackTrace()
            }
            return degree
}
2.修复照片的旋转

得到的照片旋转了多少度,我们就把它给旋转回来,进行复位

		/**
         * 照片旋转角度修复
         */
        fun rotaingImageView(angle: Int, bitmap: Bitmap): Bitmap? {
            //Log.e("TAG", "angle===$angle")
            var returnBm: Bitmap? = null
            // 根据旋转角度,生成旋转矩阵
            val matrix = Matrix()
            matrix.postRotate(angle.toFloat())
            try {
                // 将原始图片按照旋转矩阵进行旋转,并得到新的图片
                returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
            } catch (e: OutOfMemoryError) {
            }
            if (returnBm == null) {
                returnBm = bitmap
            }
            if (bitmap != returnBm) {
                bitmap.recycle()
            }
            return returnBm
        }

经过上面的两个操作后,我们会得到一个已经成功复位的照片,即Bitmap。
我所在项目是需要我将bitmap转化成一个File的Path,那么就还需要一个将Bitmap转化为File的操作,再用File得到path。

3.将Bitmap转为File,由File得到Path
fun saveBitmapFileToFile(bitmap: Bitmap):String{
            var filemm= File("yourPath.jpg") //YourPath.jpg是你自己所需要保存的文件的路径地址
            try {
                var bos = BufferedOutputStream(FileOutputStream(filemm));
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
                bos.flush();
                bos.close();
            } catch (e: IOException) {
                e.printStackTrace();
            }
            return filemm.absolutePath
        }

至此调起相机,区分7.0以上,以下的调取操作,将照片复位的操作也就完成了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值