Котлин: Как конвертировать изображение Uri в растровое изображение в Base64 - PullRequest
0 голосов
/ 28 июня 2019

Я нашел много ответов, связанных с этим в Java, возможно, решение Kotlin будет очень похоже на Java, но, как и во многих других вещах, дьявол кроется в деталях, и некоторые есть.

У меня есть несколько хранилищ Uris в базе данных SQLite, которую я использую, теперь я хочу отправить эти изображения в API, который будет перехватывать их вместе с другими данными. Я отправлю информацию через POST.

Итак, теперь я хочу загрузить Uri, как я это делаю, когда использую ImageView.setImageURI(), который возьмет Uri, преобразует его в растровое изображение и помещает его в контейнер ImageView.

Как мне преобразовать этот Uri в объект Bitmap, а затем закодировать его в Base64, чтобы отправить его в API, используя код Kotlin?


EDIT

Я пытаюсь с imageFileToBase64() от Анупама, который, кажется, именно то, что я хочу, теперь у меня проблема, я получил FileNotFoundException. Это то, что я делаю.

Я восстанавливаю строку Uri из базы данных, это строка, которая читает: content: // media / external / images / media / 109, поэтому я преобразовываю ее в Uri

val uri = Uri.parse(uri_string)

Затем я получаю реальный путь и преобразовываю его в File

val file = File(uri.path)

Наконец я вызываю функцию

val base64 = imageFileToBase64(file)

Я пробовал оба с uri.path и uri.toString() и получил одинаковые результаты.

uri.path = / external / images / media / 109

uri.toString() = контент: / мультимедиа / внешний / изображения / мультимедиа / 109

Так что я понятия не имею, что передать функции.

1 Ответ

1 голос
/ 28 июня 2019

Это методы Котлина для следующего -
1. Получить растровое изображение из активов
2. Сохранить растровое изображение в файл
3. Получить Base64 из растрового изображения
4. Кодировать файл / изображение в Base64
5. Декодировать Base64 в файл / изображение

 // Get the bitmap from assets and display into image view
    val bitmap = assetsToBitmap("tulip.jpg")
    // If bitmap is not null
    bitmap?.let {
        image_view_bitmap.setImageBitmap(bitmap)
    }


    val imagePath = "C:\\base64\\image.png"

    // Encode File/Image to Base64
    val base64ImageString = encoder(imagePath)
    println("Base64ImageString = $base64ImageString")

    // Decoder Base4 to File/Image
    decoder(base64ImageString, "C:\\base64\\decoderImage.png")

    // Click listener for button widget
    button.setOnClickListener{
        if(bitmap!=null){
            // Save the bitmap to a file and display it into image view
            val uri = bitmapToFile(bitmap)
            image_view_file.setImageURI(uri)

            // Show a toast message
            toast("Bitmap saved in a file.")
        }else{
            toast("bitmap not found.")
        }
    }
}


// Method to get a bitmap from assets
private fun assetsToBitmap(fileName:String):Bitmap?{
    return try{
        val stream = assets.open(fileName)
        BitmapFactory.decodeStream(stream)
    }catch (e:IOException){
        e.printStackTrace()
        null
    }
}


// Method to save an bitmap to a file
private fun bitmapToFile(bitmap:Bitmap): Uri {
    // Get the context wrapper
    val wrapper = ContextWrapper(applicationContext)

    // Initialize a new file instance to save bitmap object
    var file = wrapper.getDir("Images",Context.MODE_PRIVATE)
    file = File(file,"${UUID.randomUUID()}.jpg")

    try{
        // Compress the bitmap and save in jpg format
        val stream:OutputStream = FileOutputStream(file)
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream)
        stream.flush()
        stream.close()
    }catch (e:IOException){
        e.printStackTrace()
    }

    // Return the saved bitmap uri
    return Uri.parse(file.absolutePath)
}

// Method to get Base64 from bitmap
private fun imageFileToBase64(imageFile: File): String {

 return FileInputStream(imageFile).use { inputStream ->
    ByteArrayOutputStream().use { outputStream ->
        Base64OutputStream(outputStream, Base64.DEFAULT).use { base64FilterStream ->
            inputStream.copyTo(base64FilterStream)
            base64FilterStream.flush()
            outputStream.toString()
          }
       }
   }
}


// Encode File/Image to Base64   
private fun encoder(filePath: String): String{
 val bytes = File(filePath).readBytes()
 val base64 = Base64.getEncoder().encodeToString(bytes)
return base64
}


// Decode Base64 to File/Image
private fun decoder(base64Str: String, pathFile: String): Unit{
  val imageByteArray = Base64.getDecoder().decode(base64Str)
  File(pathFile).writeBytes(imageByteArray)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...