Image Converter Windows App
Aplikasi konversi gambar Windows yang berjalan lokal, dibuat dengan Rust untuk konversi batch yang lebih privat.
Tautan Repositori
GitHub: https://github.com/walujanle/image-converter-windows-app
GitLab: https://gitlab.com/walujanle/image-converter-windows-app
Tautan Unduh
Rilis Terbaru: https://links.leonardwalujan.eu.org/lw/image-converter-windows-app-latest
Checksum Rilis Terbaru (SHA-256): https://links.leonardwalujan.eu.org/lw/image-converter-windows-app-latest-checksum
Kode Sumber: https://links.leonardwalujan.eu.org/lw/image-converter-windows-app-latest-source-code
Tangkapan Layar
-
Image Converter Windows App Screenshot 1 -
Image Converter Windows App Screenshot 2 -
Image Converter Windows App Screenshot 3 -
Image Converter Windows App Screenshot 4
Penjelasan Singkat
Image Converter Windows App adalah aplikasi desktop portable untuk mengonversi gambar langsung di komputer Windows. Aplikasi ini dibuat untuk orang yang perlu mengonversi satu folder penuh gambar tanpa harus mengunggah foto pribadi ke layanan online terlebih dahulu.
Aplikasi ini membaca dan menulis JPG, PNG, WebP, AVIF, HEIC/HEIF, dan TIFF, serta dapat membaca file RAW kamera (DNG, CR2, NEF, ARW, PEF, SR2) lewat dcraw yang dibundel di dalamnya. Di sekitar itu ada sisa alur kerjanya: pemilihan format dan kualitas, resize, crop, aturan nama file, folder output khusus, preset, progress per file, dan pelestarian metadata yang bersifat opsional.
Ide utamanya sederhana. Foto tetap ada di komputer pengguna. Aplikasi membaca file lokal, memprosesnya secara lokal, menulis hasilnya secara lokal, dan tidak pernah butuh server untuk semua itu.
Tujuan Project
Saya memulai project ini karena penasaran bagaimana konversi gambar sebenarnya bekerja. Saya ingin tahu bagaimana tiap format menyimpan datanya, bagaimana metadata seperti EXIF, XMP, IPTC, dan ICC bisa bertahan (atau justru hilang) ketika berpindah container, dan sejauh mana performa konversi bisa didorong dengan Rust.
Project ini juga menjadi cara belajar Rust lewat aplikasi utuh, bukan lewat contoh kecil yang terpisah-pisah. Aplikasi lengkap memaksa saya berurusan dengan hal yang biasanya dilewati tutorial: conversion logic, metadata handling, validasi file, state UI, migrasi database, dan release packaging harus jalan bersama dan tetap jalan setelah setiap perubahan.
Sisi praktisnya juga penting. Mengonversi, mengganti nama, mengubah ukuran, dan mengompres ulang banyak gambar secara manual itu lambat dan gampang salah. Menyatukan langkah-langkah itu ke dalam satu tool lokal membuat prosesnya lebih cepat dan hasilnya lebih bisa ditebak — penamaan konsisten, format yang jelas, dan folder yang lebih rapi setelahnya.
Tech Stack yang Digunakan
- Rust untuk aplikasi dan conversion engine
- Model aplikasi desktop native Windows
- Target Windows 10/11 64-bit
- SQLite untuk penyimpanan settings dan preset secara portable
- Rust Windows/MSVC target untuk binary utama aplikasi
- MinGW/GCC untuk membangun ulang RAW decoder
dcrawketika dibutuhkan - CMD dan PowerShell untuk workflow release Windows otomatis
- Distribusi portable ZIP dengan runtime file yang dibundel bersama aplikasi
Aplikasi ini memakai codec C eksternal dan cukup banyak crate Rust di dalamnya, tapi daftar di atas fokus pada pilihan teknologi utamanya, bukan daftar dependency.
Fitur
Konversi gambar batch
Layar utama Converter. Tekan + Select Files atau drag gambar ke file list, pilih format output, lalu tekan Start Conversion. Setiap baris menampilkan persentase progressnya sendiri dan status akhirnya, jadi kegagalan menempel pada file penyebabnya, bukan menghentikan seluruh proses.
Format input dan output
Format selector di options panel. Output bisa JPG, PNG, WebP, AVIF, HEIC, atau TIFF. Input mencakup format yang sama ditambah RAW kamera (DNG, CR2, NEF, ARW, PEF, SR2) — total 15 ekstensi file.
Mode Simple dan Advanced
Tombol di header atas ketika tool Converter aktif. Simple mode meringkas kualitas menjadi empat tombol (Low, Medium, High, Ultra) dan menyembunyikan sisanya. Advanced mode membuka slider kualitas, Intent, lokasi output, resize, crop, aturan nama file, dan ukuran batch. Setiap mode menyimpan file queue dan settings-nya sendiri, jadi berpindah mode tidak menghapus daftar file yang sudah dimuat.
Kontrol kualitas dan lossless
Berada di options panel. JPG, WebP, AVIF, dan HEIC memakai nilai kualitas 1–100 yang diteruskan apa adanya ke encoder, sehingga angka 100 berarti batas maksimal format untuk keempatnya. WebP dan HEIC juga punya checkbox lossless, yang menyembunyikan kontrol kualitas ketika diaktifkan. PNG punya opsi Optimize PNG yang default-nya mati karena berat di CPU untuk batch besar. TIFF ditulis secara lossless dan tidak punya kontrol kualitas.
Encode Intent
Berada di sebelah slider kualitas pada Advanced mode, untuk format lossy. Pengaturan ini menjawab hal yang tidak bisa dijawab angka kualitas saja: file ini nantinya untuk apa?
Balanced— pilihan default, untuk konversi sehari-hari.Archive— chroma penuh jika formatnya mendukung, setelan encoder paling lambat dan paling kecil hasilnya, WebP beralih ke near-lossless pada kualitas 95 ke atas.Social— chroma disubsampling, encoding lebih cepat, kualitas dibatasi di 90, dan koordinat GPS beserta nomor seri kamera dan lensa dihapus dari metadata.
Batas pada Social ada karena platform tempat unggah akan meng-encode ulang file yang diterima, sehingga byte yang dihabiskan di atas sekitar 90 terbuang sebelum dilihat siapa pun. Batas itu ditampilkan di sebelah slider sebagai tanda panah ke nilai efektifnya, bukan diterapkan diam-diam.
Resize dan crop
Berada di Advanced mode. Resize menerima lebar dan tinggi dengan opsi kunci aspect ratio, dan memilih filternya otomatis — Mitchell untuk memperbesar, Lanczos3 untuk memperkecil. Crop memotong persentase dari sisi atas, bawah, kiri, dan kanan, dan dijalankan sebelum resize sehingga ukuran akhirnya mencerminkan keduanya.
Pengaturan nama file dan output
Berada di Advanced mode. Tersedia folder output khusus, prefix nama file, find and replace pada nama, suffix resolusi otomatis, dan penomoran urut. Ada juga bagian File List opsional yang menulis dataset_log.txt di folder output berisi daftar nama file hasil, dikelompokkan per folder output dan diberi nomor bertambah supaya proses kedua tidak menimpa daftar sebelumnya.
Pelestarian metadata
Lewat opsi Keep Metadata di converter, default-nya mati. Ketika diaktifkan, aplikasi mempertahankan EXIF, XMP, IPTC, dan ICC dalam bentuk yang didukung container tujuan, lalu menambahkan proyeksi yang bisa dibaca OS untuk kasus di mana Windows Properties membaca lebih sedikit dibanding tool seperti ExifTool. Itulah sebabnya informasi kamera, GPS, lensa, dan author tetap muncul di file properties Windows untuk format yang biasanya terlihat kosong di sana. ICC colour profile dapat ikut dibawa secara terpisah agar tampilan warna tetap konsisten.
Metadata RAW
Bagian dari metadata pipeline. Untuk file RAW yang mirip TIFF, aplikasi menelusuri rantai IFD untuk metadata yang tertanam dan juga membaca sidecar .xmp dan .iptc bila tersedia. Setiap route RAW dilacak sendiri-sendiri — RAW ke PNG, AVIF, dan TIFF sudah diverifikasi untuk sumber dengan sidecar maupun yang hanya punya metadata tertanam, sedangkan RAW ke JPG, HEIC, dan WebP masuk kelompok stable yang dilindungi — karena kamera dan container menampilkan metadata dengan cara yang cukup berbeda sehingga satu jalur generik tidak akan cukup.
Preset
Berada di preset panel dan Preset Manager. Pengguna dapat menyimpan satu set pengaturan konversi, memuat ulang preset terbaru atau pinned preset, mencari berdasarkan nama atau format, dan mengelompokkan preset ke dalam folder. Intent ikut tersimpan di dalam preset.
Backup dan restore settings
Tombol Backup dan Restore di header. Keduanya mengekspor dan mengimpor database SQLite berisi settings dan preset, yang merupakan cara paling praktis memindahkan konfigurasi ke komputer lain.
Icon Generator
Tool terpisah di tool switcher bagian atas. Dari satu gambar sumber, tool ini menghasilkan paket ikon Windows ICO, favicon web, atau ikon Android, yang ditulis sebagai file ZIP ke folder pilihan pengguna.
Settings portable
Disimpan di folder data di sebelah executable, memakai SQLite dengan write-ahead logging. Proses simpan bersifat transaksional, dan folder tersebut ikut berpindah ketika folder portable dipindahkan.
Cara Kerja
Konversi satu file mengikuti urutan yang tetap: memeriksa ukuran file terhadap batas 256 MB, mencocokkan ekstensi dengan whitelist dan magic bytes dengan signature aslinya, membaca file sekali saja ke memori, menyiapkan metadata bila Keep Metadata atau transfer ICC berlaku, decode, memperbaiki orientasi EXIF, menerapkan crop, menerapkan resize, encode ke format tujuan, menyisipkan metadata, memverifikasi metadata itu masih utuh, lalu baru mempublikasikan hasilnya.
Semua hasil ditulis dulu ke temporary file di folder output, di sebelah nama file tujuannya. Temporary file itu baru menjadi file final setelah hasil dan metadata yang diminta lolos pemeriksaan, dan file lama diganti, bukan dihapus lebih dulu. Jika encoding atau verifikasi gagal, temporary file dihapus dan file yang sudah ada dibiarkan apa adanya.
Ada beberapa batasan yang mengelilingi pipeline itu. Setiap file punya deadline lima menit yang diperiksa di antara tahapan, sehingga file yang tidak akan pernah selesai tidak menahan antrean. Konversi berjalan paralel sampai dua kali jumlah core CPU. Kegagalan tetap menempel pada file penyebabnya, jadi satu gambar yang tidak terbaca tidak ikut menjatuhkan sisa batch.
Panduan Instalasi
Untuk pengguna umum:
- Unduh ZIP portable terbaru dari tautan unduh di atas.
- Opsional: cocokkan checksum SHA-256 dengan tautan checksum.
- Ekstrak ZIP ke folder yang Anda kontrol, misalnya
Documents\Apps\Image Converter Windows App. - Jalankan
image-converter-windows-app.exe. - Simpan folder
datadi sebelah executable jika ingin settings dan preset tetap tersimpan bersama aplikasi.
Jaga agar seluruh isi folder tetap bersama. Executable memuat heif.dll, yang selanjutnya membutuhkan libx265.dll dan libde265.dll, jadi memindahkan EXE-nya sendirian akan mematikan dukungan HEIC. Aplikasi memeriksa hal ini saat startup dan melaporkannya di status bar, bukan gagal di tengah batch.
Jika Windows SmartScreen muncul, lanjutkan hanya jika file berasal dari sumber unduhan resmi. Aplikasi ini didistribusikan sebagai executable portable tanpa tanda tangan digital, sehingga sebagian sistem akan menampilkan peringatan.
Untuk developer:
-
Gunakan Windows 10/11 64-bit. Versi compiler sudah dikunci lewat
rust-toolchain.toml, jadi rustup akan mengunduh versi yang tepat secara otomatis. -
Aplikasi utama dibangun untuk target Windows MSVC. Bundle release memakai triplet vcpkg
x64-windowsdan menyalin MSVC runtime DLL. -
Install Visual Studio 2022 Build Tools dengan C++ build tools dan Windows SDK. Ini menyediakan linker MSVC yang dibutuhkan target Rust, sekaligus compiler untuk port vcpkg yang harus dibangun dari source.
-
Install MinGW/GCC dan pastikan
gcctersedia diPATH. Release script memakainya untuk membangun ulangdcraw.exedaridcraw\dcraw.cketika executable atau file hash-nya hilang atau sudah tidak cocok. -
Install Git dan CMake, karena keduanya dibutuhkan workflow vcpkg standar.
-
Install vcpkg secara standalone dan lakukan bootstrap:
git clone https://github.com/microsoft/vcpkg.git C:\vcpkg C:\vcpkg\bootstrap-vcpkg.bat -
Install port yang dibutuhkan memakai triplet
x64-windowsyang sama dengan ekspektasi release script. Jalankan dari folder vcpkg, bukan dari root project — menjalankanvcpkg installdi dalam project akan memakai manifest mode dan memasang ke folder lokal yang tidak dibaca release script:vcpkg install libheif[hevc]:x64-windows vcpkg install dav1d:x64-windows vcpkg install pkgconf:x64-windows -
Set
VCPKG_ROOTke folder vcpkg. Untuk menjalankan command Cargo secara manual, set juga:$env:PKG_CONFIG = "$env:VCPKG_ROOT\installed\x64-windows\tools\pkgconf\pkgconf.exe" $env:PKG_CONFIG_PATH = "$env:VCPKG_ROOT\installed\x64-windows\lib\pkgconfig" $env:PATH = "$env:VCPKG_ROOT\installed\x64-windows\bin;$env:PATH" -
Jalankan pemeriksaan development yang umum. Baris
PATHdi atas bukan opsional untuk test — binary test mengimporheif.dlldandav1d.dllsecara langsung dan akan gagal denganSTATUS_DLL_NOT_FOUNDbahkan sebelum satu test pun berjalan jika DLL itu tidak ditemukan:cargo check cargo test --lib cargo clippy --all-targets -- -D warnings cargo run -
Untuk membuat bundle release portable, jalankan
build_release_windows.bat. Script ini menjalankan formatting, tests, dan clippy, memverifikasi atau membangun ulangdcraw, membangun binary release, mengumpulkan DLL, lalu membuat ZIP beserta checksum SHA-256-nya. Tahap pengumpulan DLL bersifat fail-closed: jika ada file wajib yang hilang setelah proses salin, packaging dibatalkan daripada menghasilkan ZIP yang hanya jalan di komputer build.
set PUBLISHER=Nama Publisher Anda
build_release_windows.bat
Ada dua native toolchain berbeda yang terlibat di Windows: aplikasi Rust memakai target MSVC dengan vcpkg x64-windows, sedangkan jalur rebuild dcraw yang bersifat opsional memakai MinGW/GCC melalui command gcc.
cargo build --release biasa hanya menghasilkan executable di target\release. Untuk menjalankan EXE itu di luar folder release, DLL HEIC/AVIF dan MSVC runtime harus disalin sendiri di sebelahnya. Dukungan RAW juga membutuhkan dcraw.exe dan dcraw.exe.sha256 tersedia di root repository sebelum proses compile, karena aplikasi meng-embed decoder tersebut ke dalam executable dan mengekstraknya saat runtime, bukan mencari file sidecar. Kedua file itu masuk gitignore, jadi hasil clone baru tidak akan bisa dikompilasi sampai keduanya dibuat — bisa lewat command gcc atau dengan menjalankan release script yang melakukannya otomatis.
Batasan dan Masalah
- Build resmi hanya menargetkan Windows 10/11 64-bit.
- Gambar yang sangat besar memakan banyak memori. Pipeline membaca seluruh file sumber ke RAM tanpa streaming, dan proses resize butuh buffer sumber sekaligus buffer tujuan, sehingga gambar 100 MP saja bisa menghabiskan beberapa ratus megabyte.
- Input dibatasi 256 MB per file dan 16384×16384 piksel.
- Setiap file punya deadline konversi lima menit dan tidak ada mekanisme retry.
- PNG optimization bersifat opsional dan dinonaktifkan secara default karena lambat dan berat di CPU.
- Dukungan RAW bergantung pada decoder yang dibundel dan pada cara masing-masing kamera menulis filenya. Subprocess
dcrawtidak di-sandbox; byte-nya diverifikasi dengan SHA-256, tetapi itu melindungi dari pemalsuan binary, bukan dari file rusak yang mengeksploitasi parser-nya. - Visibilitas metadata bisa berbeda antara Windows Properties, metadata tools profesional, dan sistem operasi lain.
- WebP, AVIF, dan HEIC tidak mendukung IPTC secara native, sehingga IPTC dilepas untuk output tersebut.
- AVIF belum bisa menyematkan ICC profile, karena keterbatasan encoder
ravif. - ICC profile disalin apa adanya, tidak pernah dikonversi. Sumber Display-P3 yang dikirim ke tempat yang menganggapnya sRGB akan terlihat pudar; colour management sesungguhnya belum diimplementasikan.
- Angka kualitas diteruskan ke tiap encoder tanpa penyesuaian, dan pengaturan Intent adalah default berbasis pertimbangan, bukan hasil pengukuran. Belum ada metrik perseptual yang memastikan kualitas 80 terlihat setara di semua format.
- Build portable tanpa tanda tangan digital dapat memicu peringatan Windows SmartScreen.
Lisensi
Image Converter Windows App dirilis dengan GNU General Public License v3.0 or later.
Artinya, pengguna dapat mempelajari, memodifikasi, dan mendistribusikan ulang project ini sesuai ketentuan GPL. Bundle release juga menyertakan komponen codec dan runtime pihak ketiga — libheif dan libde265 dengan LGPL-3.0, x265 dengan GPL-2.0+, dav1d dengan BSD-2-Clause, serta dcraw dengan lisensi milik Dave Coffin sendiri — sehingga lisensi masing-masing tetap berlaku untuk bagian tersebut.
Proyek Terbaru
Image Converter Web App
Aplikasi konversi gambar lokal di browser, dibuat dengan React, TypeScript, Web Workers, dan engine npm Rust/WebAssembly.
Image Converter WASM
Package konversi gambar berbasis Rust WebAssembly untuk browser dan Node.js, dipublikasikan sebagai package npm.
Tes
Tes