코딩 일기장/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, 코드 짜기
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} | |
} | |
} | |
} | |
} | |
} |
생각보다 쉬웠다!!!
라이브러리만 추가하면 뚝딱뚝딱 만들 수 있음...
반응형