Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีแปลงรูปภาพเป็น Base64 String ใน Android ด้วย Kotlin

ตัวอย่างนี้สาธิตวิธี แปลง Bitmap/Image เป็น Base64 String เพื่อส่งผ่าน JSON, เก็บใน Database หรือส่งผ่าน Network

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

Android Studio → New Project → Empty Activity

ขั้นตอนที่ 2: Layout (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvBase64"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:textSize="12sp"
        android:textColor="@android:color/black"
        android:textStyle="bold"
        android:gravity="center" />

</RelativeLayout>

ขั้นตอนที่ 3: โค้ดหลัก (MainActivity.kt)

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Bundle
import android.util.Base64
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import java.io.ByteArrayOutputStream

class MainActivity : AppCompatActivity() {
    private lateinit var tvBase64: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "Image to Base64"

        tvBase64 = findViewById(R.id.tvBase64)

        // แปลงรูปจาก Drawable Resource
        convertImageToBase64(R.drawable.sample_image)
    }

    private fun convertImageToBase64(@DrawableRes drawableRes: Int) {
        // 1. Decode Resource เป็น Bitmap
        val bitmap = BitmapFactory.decodeResource(resources, drawableRes)
            ?: return

        // 2. Compress Bitmap เป็น ByteArray (JPEG 90% quality)
        val byteArrayOutputStream = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, byteArrayOutputStream)
        val imageBytes = byteArrayOutputStream.toByteArray()

        // 3. Encode เป็น Base64 String
        val base64String = Base64.encodeToString(imageBytes, Base64.DEFAULT)

        // 4. แสดงผล (ตัดท้ายเพื่อไม่ให้ยาวเกินไป)
        val preview = if (base64String.length > 500) {
            base64String.substring(0, 500) + "... (truncated)"
        } else {
            base64String
        }
        tvBase64.text = "Base64 Length: ${base64String.length}\n\n$preview"

        // 💡 ส่งไป Server/JSON
        // val json = JSONObject().put("image", base64String)
    }
}

🔄 ฟังก์ชันครบวงจร: Base64 ↔ Bitmap

/** แปลง Bitmap → Base64 String */
fun bitmapToBase64(bitmap: Bitmap, format: Bitmap.CompressFormat = Bitmap.CompressFormat.JPEG, quality: Int = 90): String {
    val stream = ByteArrayOutputStream()
    bitmap.compress(format, quality, stream)
    return Base64.encodeToString(stream.toByteArray(), Base64.NO_WRAP)
}

/** แปลง Base64 String → Bitmap */
fun base64ToBitmap(base64: String): Bitmap? {
    return try {
        val decoded = Base64.decode(base64, Base64.DEFAULT)
        BitmapFactory.decodeByteArray(decoded, 0, decoded.size)
    } catch (e: IllegalArgumentException) {
        null
    }
}

/** แปลง File/Uri → Base64 */
fun uriToBase64(context: Context, uri: Uri): String? {
    return try {
        context.contentResolver.openInputStream(uri)?.use { inputStream ->
            val bytes = inputStream.readAllBytes()
            Base64.encodeToString(bytes, Base64.NO_WRAP)
        }
    } catch (e: Exception) {
        null
    }
}

⚠️ ข้อควรระวัง

  • ขนาดไฟล์เพิ่ม ~33% (Base64 overhead)
  • หน่วยความจำ (Memory): รูปใหญ่อาจทำให้ OOM → ควร Resize/Compress ก่อน
  • Base64.NO_WRAP: ไม่ขึ้นบรรทัดใหม่ เหมาะสำหรับ JSON/Database
  • PNG vs JPEG: PNG คงคุณภาพ แต่ไฟล์ใหญ่กว่า JPEG

📱 ใช้กับ Camera/Gallery (Real World)

// ใน onActivityResult หลังเลือกภาพจาก Gallery
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == PICK_IMAGE && resultCode == RESULT_OK) {
        val uri = data?.data ?: return
        val base64 = uriToBase64(this, uri)
        // ส่ง base64 ไป Server
    }
}

ขั้นตอนที่ 4: AndroidManifest.xml

Manifest มาตรฐาน

ทดสอบ

  1. เพิ่มรูปภาพใน res/drawable/sample_image.jpg
  2. รันแอป → จะแสดง Base64 String ความยาว ~หลายหมื่นตัวอักษร
  3. Copy ไปทดสอบ Decode ที่ base64.guru