ตัวอย่างนี้สาธิตวิธี แปลง 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 มาตรฐาน
ทดสอบ
- เพิ่มรูปภาพใน
res/drawable/sample_image.jpg - รันแอป → จะแสดง Base64 String ความยาว ~หลายหมื่นตัวอักษร
- Copy ไปทดสอบ Decode ที่ base64.guru