Aplikasi Desktop

Image Converter Windows App

Aplikasi konversi gambar Windows yang berjalan lokal, dibuat dengan Rust untuk konversi batch yang lebih privat.

Aplikasi Desktop Windows Rust

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

  1. Image Converter Windows App Screenshot 1
    Image Converter Windows App Screenshot 1
  2. Image Converter Windows App Screenshot 2
    Image Converter Windows App Screenshot 2
  3. Image Converter Windows App Screenshot 3
    Image Converter Windows App Screenshot 3
  4. Image Converter Windows App Screenshot 4
    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 dcraw ketika 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:

  1. Unduh ZIP portable terbaru dari tautan unduh di atas.
  2. Opsional: cocokkan checksum SHA-256 dengan tautan checksum.
  3. Ekstrak ZIP ke folder yang Anda kontrol, misalnya Documents\Apps\Image Converter Windows App.
  4. Jalankan image-converter-windows-app.exe.
  5. Simpan folder data di 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:

  1. Gunakan Windows 10/11 64-bit. Versi compiler sudah dikunci lewat rust-toolchain.toml, jadi rustup akan mengunduh versi yang tepat secara otomatis.

  2. Aplikasi utama dibangun untuk target Windows MSVC. Bundle release memakai triplet vcpkg x64-windows dan menyalin MSVC runtime DLL.

  3. 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.

  4. Install MinGW/GCC dan pastikan gcc tersedia di PATH. Release script memakainya untuk membangun ulang dcraw.exe dari dcraw\dcraw.c ketika executable atau file hash-nya hilang atau sudah tidak cocok.

  5. Install Git dan CMake, karena keduanya dibutuhkan workflow vcpkg standar.

  6. Install vcpkg secara standalone dan lakukan bootstrap:

    git clone https://github.com/microsoft/vcpkg.git C:\vcpkg
    C:\vcpkg\bootstrap-vcpkg.bat
  7. Install port yang dibutuhkan memakai triplet x64-windows yang sama dengan ekspektasi release script. Jalankan dari folder vcpkg, bukan dari root project — menjalankan vcpkg install di 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
  8. Set VCPKG_ROOT ke 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"
  9. Jalankan pemeriksaan development yang umum. Baris PATH di atas bukan opsional untuk test — binary test mengimpor heif.dll dan dav1d.dll secara langsung dan akan gagal dengan STATUS_DLL_NOT_FOUND bahkan sebelum satu test pun berjalan jika DLL itu tidak ditemukan:

    cargo check
    cargo test --lib
    cargo clippy --all-targets -- -D warnings
    cargo run
  10. Untuk membuat bundle release portable, jalankan build_release_windows.bat. Script ini menjalankan formatting, tests, dan clippy, memverifikasi atau membangun ulang dcraw, 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 dcraw tidak 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