glide 와 bitmap 관련 코드

나고수·2022년 8월 28일
0

1일1공부

목록 보기
63/67

canvas에 bitmap 그리기

    val originalBitmap = .... //그리고 싶은 bitmap 이 있다고 칩시다. 
    val paint = Paint()

    //원본 사진 drawBitmap
    canvas.drawBitmap(originalBitmap, 0f, 0f, paint)

이미지뷰의 drawable이 디바이스에 보이는 사이즈만큼 캔버스 만들어서 뷰 그리기

 //이미지뷰의 drawable이 디바이스에 보이는 크기 만큼 bitmap 을 만든다.
val sizedBitmap = Bitmap.createBitmap(
	getImageBounds((binding.imageView as ImageView)).width().toInt(),
    getImageBounds((binding.imageView as ImageView)).height().toInt(),
    Bitmap.Config.ARGB_8888
    )
    
val sizedViewCanvas = Canvas(sizedBitmap) //drawable이 디바이스에 보이는 크기만큼의 사이즈를 가진 canvas
someView.draw(sizedViewCanvas) //그리고자 하는 view를 drawViewCanvas에 그린다.
//이러면 어떤뷰를 imageview 의 drawable이 디바이스에 실제 보이는 만큼 크기의 bitmap으로 변환하기 성공

//imageview의 drawable이 화면에 보이는만큼의 rect
fun getImageBounds(imageView: ImageView): RectF {
	val bounds = RectF()
    val drawable: Drawable? = imageView.drawable
    if (drawable != null) {
        imageView.imageMatrix.mapRect(bounds, RectF(drawable.bounds))
    }
    return bounds
}

uri로 이미지 실제 사이즈 가져오기

fun getOriginalImageSize(uri: Uri, context: Context): Pair<Int, Int> {
	val options = BitmapFactory.Options()
    options.inJustDecodeBounds = true
    BitmapFactory.decodeStream(
        context.contentResolver.openInputStream(uri),
        null,
        options
    )
    val imageHeight = options.outWidth
    val imageWidth = options.outHeight
    return imageHeight to imageWidth
}

bitmap scaledup

val scaledBitmap = (Bitmap.createScaledBitmap(
	textViewBitmap, //scale up 하고 싶은 작은 사이즈의 bitmap
    500, //scale up 하고 싶은 사이즈 width
    500, //scale up 하고 싶은 사이즈 height
    true //fitler. 이미지 pixel형태를 조정해 주어서 이미지가 선명하게 보이도록 도움을 준다.
))

glide 사용 시 - 캐시 사용 안하기 및 사진 로딩 완료 리스너

    private fun setImage() {

        Glide.with(this)
            .load(Uri.parse(uri)) //uri로 이미지 로드
             //지금 상황에서는 이미지 편집 후 같은 uri를 이용해서 이미지를 저장함
             //그런데 분명 실제 디바이스에서 확인했을 시에는 이미지가 바뀌었는데
             //뷰에서는 이미지가 변경이 안되고 계속 예전 이미지로 로드되었음
            //알고보니 glide는 빠른 이미지 로드를 위해, 한번 이미지를 로딩하면 캐시 형태로 메모리에 이미지를 저장한다.
            //그래서 같은 uri 를 사용 시, 다시 이미지를 불러오지 않고 캐싱된 이미지를 로딩했기 때문에 이미지 변경이 안됐던 것이다.
            //아래 두 줄을 추가하면 캐시 사용을 하지 않고 매번 이미지를 불러오기 때문에 같은 uri 라도 이미지가 잘 변경된다.
            .apply(RequestOptions.skipMemoryCacheOf(true)) //메모리 캐시 사용 no
            .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE)) //디스크 캐시 사용 no
            .listener(object : RequestListener<Drawable> { //이미지 로드 완료 시 리스너
                override fun onLoadFailed( //실패 시
                    e: GlideException?,
                    model: Any?,
                    target: com.bumptech.glide.request.target.Target<Drawable>?,
                    isFirstResource: Boolean
                ): Boolean {
                    return false
                }

                override fun onResourceReady( //성공 시
                    resource: Drawable?,
                    model: Any?,
                    target: com.bumptech.glide.request.target.Target<Drawable>?,
                    dataSource: DataSource?,
                    isFirstResource: Boolean
                ): Boolean {
                    if (resource is BitmapDrawable) {
                        val bitmap = resource.bitmap
                        bitmap.byteCount		// 리사이징된 이미지 바이트
                        bitmap.width	    	// 이미지 넓이
                        bitmap.height			// 이미지 높이
                    }
                    return false
                }
            })
            .into(binding.imageView)

    }
profile
되고싶다

0개의 댓글