코딩 일기장/Android(Kotlin)

[안드로이드] 갤러리에서 사진 가져오고 크롭하기(크기 조절하기)

minWachya 2021. 6. 24. 17:58
반응형

오늘 구현해 볼 건 이미지 크롭하기~~

실행화면은 아래와 같다.

권한 설정하기
앨범에서 사진 선택하기

 

사진 크롭하기~~
사진 설정 완료!

1.  Gradle.build(:app)에 라이브러리 추가하기

implementation 'com.yanzhenjie:permission:2.0.3' // 권한 설정 위해
implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' // 사진 크롭 위해

 

2, Manifest에서 갤러리 접근 권한 추가하기

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

 

3, Manifest에서 크롭 액티비티 추가하기

<activity android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
android:theme="@style/Base.Theme.AppCompat" android:label="크롭 액티비티"/>

 

4, 코드 짜기

package com.example.mycapturetest
import android.app.Activity
import android.content.Intent
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.ImageView
import com.theartofdev.edmodo.cropper.CropImage
import com.theartofdev.edmodo.cropper.CropImageView
import com.yanzhenjie.permission.AndPermission
import com.yanzhenjie.permission.runtime.Permission
private const val PICK_FROM_ALBUM = 0 // 앨범에서 사진 잘 가져왔을 때의 result code
class MainActivity : AppCompatActivity() {
lateinit var btnPictureCrop : Button
lateinit var imageView : ImageView
var uri : Uri? = null // 이미지 파일 경로
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnPictureCrop = findViewById(R.id.btnPictureCrop)
imageView = findViewById(R.id.imageView)
// 권한 처리
AndPermission.with(this@MainActivity)
.runtime()
.permission(Permission.READ_EXTERNAL_STORAGE)
.onGranted { permissions ->
Log.d("mmm", "허용된 권한 갯수 : ${permissions.size}")
}
.onDenied { permissions ->
Log.d("mmm", "거부된 권한 갯수 : ${permissions.size}")
}
.start()
// 버튼 누르면 사진 가져오기
btnPictureCrop.setOnClickListener {
getFromAlbum()
}
}
// 갤러리 이미지 선택해서 가져오기
fun getFromAlbum() {
val intent = Intent("android.intent.action.GET_CONTENT")
intent.type = "image/*" // 모든 이미지
startActivityForResult(intent, PICK_FROM_ALBUM)
Log.d("mmm ddk", CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE.toString())
}
// 사진 크롭하기
private fun cropImage(uri: Uri?) {
CropImage.activity(uri).setGuidelines(CropImageView.Guidelines.ON) // 크롭 위한 가이드 열어서 크롭할 이미지 받아오기
.setCropShape(CropImageView.CropShape.RECTANGLE) // 사각형으로 자르기
.start(this@MainActivity)
// 프레그먼트에서 사용할 땐 .start(activity as 프레그먼트의 부모 Activity, this@형재 프레그먼트 이름)
}
// 읍답 받은 액티비티
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data);
// 이미지 잘 선택했으면
when (requestCode) {
// 앨범에서 사진 가져오기
PICK_FROM_ALBUM -> {
if (resultCode == Activity.RESULT_OK) {
if (Build.VERSION.SDK_INT >= 19) {
uri = data?.data // 선택한 이미지의 주소
// 사용자가 이미지를 선택했으면(null이 아니면)
if (uri != null) {
cropImage(uri)
}
}
}
}
// 크롭해서 프로필 사진 설정하기
CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE -> {
val result = CropImage.getActivityResult(data)
if (resultCode == Activity.RESULT_OK) {
result.uri?.let {
// 이미지 파일 읽어와서 설정하기
val bitmap = BitmapFactory.decodeStream(
contentResolver!!.openInputStream(result.uri!!)
// 프레그먼트명 activity?.contentResolver!!.openInputStream(result.uri!!)
)
imageView.setImageBitmap(bitmap)
}
}
}
}
}
}
view raw MainActivity.kt hosted with ❤ by GitHub

생각보다 쉬웠다!!!

라이브러리만 추가하면 뚝딱뚝딱 만들 수 있음...

 

반응형