본문 바로가기
카테고리 없음

[kotlin] FileInputStream의 FileDescriptor Int값을 획득한 방법 입니다.

by Hwoarang757 2025. 2. 19.

TiffBitmapFactory 라이브러리 출처 : https://github.com/Beyka/Android-TiffBitmapFactory

 

GitHub - Beyka/Android-TiffBitmapFactory

Contribute to Beyka/Android-TiffBitmapFactory development by creating an account on GitHub.

github.com

 

TiffBitmapFactory 라이브러리를 이용하여 TIFF 이미지를 Bitmap으로 변환 방법을 찾던 중 

decodeFileDescriptor 메서드를 이용하여 파일을 읽으려고 시도 시에

첫번째 입력 매개변수가 FileDescriptor가 아닌 Int 부분이었습니다 , 방법을 찾던 중 아래와 같은 방법을 찾았습니다. 

 

 

FileDescriptor 클래스 private 접근 자 descriptor 필드 값을 Reflection으로 가져오도록 시도 하였습니다.

 

확장 메서드를 활용 하였습니다.

fun FileDescriptor.getFdFromDescriptor() : Int {
    val methodName = this::getFdFromDescriptor.name
    return try {
        val field = FileDescriptor::class.java.getDeclaredField("descriptor")
        field.isAccessible = true
        field.getInt(this)
    } catch(e: Exception) {
        Log.d(methodName , e.message.toString())
    }
}

 

사용 예시

        for(i in 0 until pageCount) {
            FileInputStream(tempFile).use {
            fis ->
                val nFd = fis.fd.getFdFromDescriptor()

                options.inJustDecodeBounds = false
                options.inDirectoryNumber = i // 페이지 번호
                val bitmap = TiffBitmapFactory.decodeFileDescriptor(nFd, options)
                bitmap?.let { bitmapList.add(it) }
            }
        }