Javascript

Konversi (Client Side) Heic ke JPG Sebelum Upload

2 min read
Konversi (Client Side) Heic ke JPG

Sejak iOS 11, iPhone menggunakan format HEIC sebagai default untuk foto. Bagi developer web, ini menciptakan masalah baru: aplikasi web tidak bisa memproses file HEIC dengan mudah. Server berbasis PHP dengan GD Library tidak mendukung HEIC, sementara user iPhone terus mengupload file yang tidak kompatibel.

Masalah umum yang dihadapi:

  • File HEIC ditolak oleh validasi server
  • Ukuran file HEIC yang besar (3-8MB per foto)
  • User confusion ketika upload gagal
  • Perlu setup ImageMagick yang kompleks di server

Solusi: Client-Side Conversion dengan heic2any

Daripada menangani konversi di server, kita bisa memanfaatkan JavaScript untuk mengkonversi HEIC ke JPG di browser user sebelum upload. Solusi ini elegant karena:

  • Tidak perlu instalasi library tambahan di server
  • Beban processing di client, bukan server
  • User experience yang seamless
  • File yang sampai ke server sudah dalam format optimal

Implementasi Code

1. Setup Library

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/heic2any.min.js"></script>

2. Enhanced File Input

<input type="file" id="photo" accept="image/*,.heic,.heif" onchange="handleFileUpload(this)">
<div id="status"></div>

3. JavaScript Handler

async function handleFileUpload(input) {
    if (!input.files || !input.files[0]) return;
    
    let file = input.files[0];
    const statusDiv = document.getElementById('status');
    
    // Deteksi file HEIC
    const isHeic = file.type === 'image/heic' || 
                   file.type === 'image/heif' || 
                   file.name.toLowerCase().endsWith('.heic');
    
    if (isHeic) {
        statusDiv.innerHTML = '<i class="spinner"></i> Konversi HEIC ke JPG...';
        
        try {
            // Konversi HEIC ke JPG
            const convertedBlob = await heic2any({
                blob: file,
                toType: "image/jpeg",
                quality: 0.8
            });
            
            // Buat file baru
            const newFileName = file.name.replace(/\.heic$/i, '.jpg');
            const newFile = new File([convertedBlob], newFileName, {
                type: 'image/jpeg'
            });
            
            // Update input
            const dt = new DataTransfer();
            dt.items.add(newFile);
            input.files = dt.files;
            
            // Tampilkan hasil
            const originalSize = (file.size / 1024 / 1024).toFixed(2);
            const newSize = (newFile.size / 1024 / 1024).toFixed(2);
            const savings = Math.round(((file.size - newFile.size) / file.size) * 100);
            
            statusDiv.innerHTML = `
                ✅ Konversi berhasil!<br>
                ${originalSize}MB → ${newSize}MB (Hemat ${savings}%)
            `;
            
        } catch (error) {
            statusDiv.innerHTML = '❌ Konversi gagal. Coba file lain.';
            input.value = '';
        }
    }
}

Performance & Compatibility
Browser Support

  • ✅ Chrome 57+
  • ✅ Firefox 52+
  • ✅ Safari 11+
  • ✅ Edge 79+
  • ❌ Internet Explorer (tidak didukung)

Performance Benchmark

Berdasarkan testing dengan file HEIC dari iPhone:

Original HEIC Converted JPG Waktu Konversi Penghematan
8.2 MB 2.8 MB ~3 detik 66%
5.1 MB 1.9 MB ~2 detik 63%
3.4 MB 1.2 MB ~1.5 detik 65%

Memory Usage

  • Peak memory: ~2x ukuran file original
  • Untuk file 8MB, butuh ~16MB RAM sementara
  • Automatic cleanup setelah konversi selesai

Best Practices

  1. Tambahkan Loading State: User perlu tahu proses konversi sedang berjalan
  2. Validation: Cek status konversi sebelum submit form
  3. Error Handling: Berikan alternatif jika konversi gagal
  4. File Size Limit: Tetap validasi ukuran file di client dan server
  5. Progressive Enhancement: Pastikan form tetap berfungsi tanpa JavaScript

Kesimpulan

Konversi HEIC di client-side menggunakan heic2any adalah solusi praktis untuk masalah upload iPhone photos. Implementasi ini memberikan user experience yang smooth sambil menjaga kompatibilitas server. Dengan penghematan ukuran file rata-rata 65% dan dukungan browser modern yang luas, teknik ini ready untuk production use.


Related Posts

Chat!
1