Как установить вертикальное изображение, когда изображение снимается камерой? - PullRequest
1 голос
/ 06 мая 2020

Я только что добавил камеру в свое приложение. Однако, когда я делаю снимок и для указанного снимка установлен режим просмотра изображения, изображение поворачивается. Почему это происходит? Когда я делаю снимок вертикально, вид изображения показывает его горизонтально, а когда я делаю снимок горизонтально, вид изображения показывает его вертикально. Вот код камеры:

 private fun openCamera() {
    val values = ContentValues()
    values.put(MediaStore.Images.Media.TITLE,"New Picture")
    values.put(MediaStore.Images.Media.DESCRIPTION,"From the Camera")
    image_uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values)
    //camera intent
    val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, image_uri)
    startActivityForResult(cameraIntent,IMAGE_CAPTURE_CODE)


}

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    //called when user presses alow or deny from premissio request
    when(requestCode){
        PERMISSION_CODE ->{
            if(grantResults.size > 0 && grantResults[0]== PackageManager.PERMISSION_GRANTED){
                //PERMISSION FROM POPUP WAS GRANTED
                openCamera()

            }else{
                //permisson from popup was denied
                Toast.makeText(this,"Permission denied", Toast.LENGTH_SHORT).show()
            }
        }
    }
}


@SuppressLint("MissingSuperCall")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

    //called when image was captured from camera intet
    if(resultCode==Activity.RESULT_OK){
        //set image captured to image view
        image_view.setImageURI(image_uri)


        //get location

        //stop compass

    }
}

Вот мой макет изображения:

  <ImageView
    android:id="@+id/image_view"
    android:layout_width="283dp"
    android:layout_height="331dp"
    android:layout_marginTop="100dp"
    android:background="@drawable/image1"
    android:scaleType="centerCrop"
    android:orientation="vertical"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.515" />

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

У меня была такая же проблема пару месяцев go, и я могу дать вам метод, который я использовал, и он работал именно так. Есть некоторые отличия до Android P ie и после. В любом случае, с помощью этого метода вы получите растровое изображение из photoUri, и вы можете использовать растровое изображение для заполнения imageView в конце. Если у вас есть сомнения, свяжитесь со мной здесь.

// Getting captured image as a bitmap
@TargetApi(Build.VERSION_CODES.P)
private fun getCapturedImage(selectedPhotoUri: Uri): Bitmap {

    val bitmap = when {
        Build.VERSION.SDK_INT < Build.VERSION_CODES.P -> MediaStore.Images.Media.getBitmap(
            context?.contentResolver,
            selectedPhotoUri
        )
        else -> {
            val source = ImageDecoder.createSource(context!!.contentResolver, selectedPhotoUri)
            ImageDecoder.decodeBitmap(source)
        }
    }

    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, Matrix().apply {}, true)
    } else {
        MediaStore.Images.Media.getBitmap(context?.contentResolver, context?.let { getImageUri(it, bitmap) })
    }
}


// Getting image Uri from the bitmap, its needed for android level 6 (sdk 23)
private fun getImageUri(inContext: Context, inImage: Bitmap): Uri {
    val outImage: Bitmap = if (inImage.width > inImage.height) {
        Bitmap.createScaledBitmap(inImage, 2560, 1440, true)
    } else {
        Bitmap.createScaledBitmap(inImage, 1440, 2560, true)
    }
    val path = MediaStore.Images.Media.insertImage(inContext.contentResolver, outImage, "Title", null)
    return Uri.parse(path)

}
0 голосов
/ 06 мая 2020

Это происходит для всех устройств или только для некоторых? Насколько я думаю, это должно происходить не на всех устройствах. Вы проверяли это?

Вы можете попробовать решение, приведенное ниже. Это происходит из-за того, что большинство камер телефонов имеют альбомную ориентацию, то есть если вы сделаете фотографию в портретной ориентации, полученные фотографии будут повернуты на 90 градусов. В этом случае программное обеспечение камеры должно заполнить данные Exif с ориентацией, в которой должна просматриваться фотография.

Это решение должно работать, но не на 100% надежно, потому что оно зависит от производитель телефона devive / camera Exif data.

    ExifInterface ei = new ExifInterface(photoPath);
    int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                                     ExifInterface.ORIENTATION_UNDEFINED);

    Bitmap rotatedBitmap = null;
    switch(orientation) {

    case ExifInterface.ORIENTATION_ROTATE_90:
        rotatedBitmap = rotateImage(bitmap, 90);
        break;

    case ExifInterface.ORIENTATION_ROTATE_180:
        rotatedBitmap = rotateImage(bitmap, 180);
        break;

    case ExifInterface.ORIENTATION_ROTATE_270:
        rotatedBitmap = rotateImage(bitmap, 270);
        break;

    case ExifInterface.ORIENTATION_NORMAL:
    default:
        rotatedBitmap = bitmap;
}
    public static Bitmap rotateImage(Bitmap source, float angle) {
         Matrix matrix = new Matrix();
         matrix.postRotate(angle);
         return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
                               matrix, true);
    }


Примечание. Если это решение вам не известно, я мог бы предоставить другое, возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...