Blog Metlivi

Cara Menghapus atau Membuat Piksel Semi-Transparan Menjadi Solid pada Frame Karakter yang Dirender

Untuk menghapus piksel semi-transparan dari frame karakter yang dirender, ubah nilai alphanya menjadi sepenuhnya transparan atau sepenuhnya opak. Pilih apakah akan menghapus setiap piksel yang transparansinya sebagian, membuat setiap piksel yang terlihat menjadi solid, atau menggunakan batas yang mempertahankan bagian kontur yang lebih kuat.

Alur kerja ini ditujukan bagi kreator yang menyiapkan frame PNG karakter transparan dengan tepi yang tegas. Panduan ini mencakup metode visual di GIMP dan metode Python yang dapat diulang untuk seluruh folder frame, termasuk pemeriksaan bahwa gambar yang diekspor tidak mengandung nilai alpha menengah.

29 Oktober 2026Waktu baca 8 menitOleh Metlivi Editorial Team
Bagian 1

Apa tepatnya yang perlu diubah pada frame?

Pada gambar RGBA 8-bit, setiap piksel memiliki komponen merah, hijau, biru, dan alpha. Alpha 0 berarti sepenuhnya transparan; alpha 255 berarti sepenuhnya opak. Nilai 1 hingga 254 berarti transparansinya sebagian. Pillow mendokumentasikan RGBA sebagai empat kanal 8-bit dengan mask transparansi. Pillow: Konsep

Karena itu, sebuah frame dapat tampak hampir solid, tetapi tetap mengandung banyak piksel yang transparansinya sebagian. Sebelum mengedit, periksa salinannya pada ukuran tampilan yang diinginkan dan dalam tampilan piksel yang diperbesar. Letakkan latar terang dan gelap di bawahnya untuk sementara. Cari piksel luar yang samar, detail tipis yang hilang, dan pinggiran warna.

Tentukan apakah transparansi sebagian memang diperlukan dalam karya akhir. Aksesori tembus pandang atau bayangan lembut akan banyak berubah jika dipaksa menjadi mask opak atau transparan. Jika hanya kontur karakter yang perlu diperbaiki, pisahkan area atau lapisan tersebut sebelum menerapkan operasi global.

Simpan frame hasil render asli. Thresholding menyatukan banyak nilai alpha ke dua nilai ujung, sehingga berkas yang diproses tidak lagi menyimpan informasi seberapa transparan piksel tersebut semula.

Bagian 2

Sebaiknya piksel parsial dihapus atau dibuat solid?

Gunakan satu aturan yang jelas untuk seluruh rangkaian frame. Pada tabel di bawah, C adalah nilai alpha minimum yang dipertahankan, dan setiap piksel yang dipertahankan menjadi sepenuhnya opak. Aturan ini berlaku untuk input 8-bit.

Hasil yang diinginkan Aturan Kompromi visual utama
Menghapus semua piksel semi-transparan Pertahankan hanya alpha 255 Detail tipis yang seluruhnya terdiri dari piksel parsial akan hilang
Membuat semua piksel yang terlihat menjadi solid Pertahankan alpha 1–255 Piksel luar yang samar menjadi bagian dari siluet solid
Memilih kontur dengan tingkat menengah Pertahankan alpha ≥ C; buang alpha < C Batas menentukan piksel tepi mana yang bertahan

Sebagai contoh, perhatikan nilai alpha ilustratif 0, 1, 64, 127, 128, 254, 255. Dengan C = 128, hasilnya menjadi 0, 0, 0, 0, 255, 255, 255. Dengan C = 255, hanya piksel terakhir yang bertahan. Dengan C = 1, semua piksel yang semula terlihat menjadi opak.

Mulailah dengan C = 128 sebagai titik pembanding, lalu periksa karakter sebenarnya. Ini titik tengah yang praktis, bukan pengaturan terbaik yang sudah terbukti. Naikkan nilainya jika piksel samar yang tidak diinginkan masih tersisa; turunkan jika detail yang berguna menghilang. Gunakan frame asli untuk setiap perbandingan.

Jika menaikkan batas menghilangkan pinggiran, tetapi juga merusak detail penting, satu batas global tidak dapat memenuhi kedua tujuan tersebut. Perbaiki detail itu secara lokal atau pisahkan menjadi mask tersendiri sebelum memproses kontur yang lain.

Bagian 3

Bagaimana cara menerapkan threshold alpha di GIMP?

GIMP 3 menyediakan Layer → Transparency → Threshold Alpha…. Fitur ini bekerja pada satu lapisan, memerlukan kanal alpha, dan tidak berpengaruh jika Lock alpha channel aktif. Nilai threshold berkisar dari 0 hingga 1: nilai di atas threshold menjadi opak, sedangkan nilai yang sama dengan atau di bawahnya menjadi transparan. GIMP: Threshold Alpha

  1. Buka salinan frame dan pilih lapisan karakter.
  2. Pastikan lapisan memiliki kanal alpha dan nonaktifkan Lock alpha channel.
  3. Buka Layer → Transparency → Threshold Alpha….
  4. Pratinjau threshold 0.5 untuk pemotongan titik tengah, atau 0 untuk membuat setiap piksel dengan alpha bukan nol menjadi solid.
  5. Periksa detail kecil dan kontur luar sebelum menerapkan operasi.
  6. Ekspor hasilnya sebagai PNG terpisah.

Untuk input 8-bit, threshold 254/255, sekitar 0.996078, hanya mempertahankan piksel yang semula memiliki alpha 255. Hindari mengatur threshold ke 1 untuk tujuan ini: berdasarkan perbandingan ketat yang didokumentasikan, bahkan alpha 1 berada pada nilai threshold dan menjadi transparan. GIMP: Threshold Alpha

Jangan sertakan latar pemeriksaan sementara dalam berkas karakter yang diekspor. Buka kembali PNG setelahnya agar Anda juga menilai hasil ekspornya, bukan hanya dokumen yang dapat diedit.

Bagian 4

Bagaimana menerapkan aturan yang sama ke setiap frame?

Untuk banyak frame, gunakan pemetaan alpha yang tetap alih-alih menyesuaikan setiap gambar secara terpisah. Program Python lengkap berikut memproses langsung berkas PNG di dalam satu folder, mempertahankan nama dan dimensinya, lalu menulis hasil ke folder baru.

Instal Pillow dengan python -m pip install Pillow, lalu simpan program sebagai alpha_clean.py. Gunakan frame PNG RGBA 8-bit statis yang terpisah. Ekspor gambar palet, hasil render berpresisi lebih tinggi, atau jenis gambar lain ke format tersebut secara sengaja sebelum menggunakan alur kerja ini.

Program ini mengambil alpha dengan getchannel, memetakannya melalui tabel pencarian dengan point, dan hanya mengganti alpha dengan putalpha. Operasi ini didokumentasikan dalam referensi modul Image Pillow.

import argparse
from pathlib import Path
from PIL import Image


def threshold_alpha(image, cutoff):
    result = image.copy()
    table = [255 if value >= cutoff else 0 for value in range(256)]
    result.putalpha(image.getchannel("A").point(table))
    return result


def partial_count(image):
    return sum(image.getchannel("A").histogram()[1:255])


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("source", type=Path)
    parser.add_argument("destination", type=Path)
    parser.add_argument("--cutoff", type=int, default=128)
    parser.add_argument("--demo", action="store_true")
    args = parser.parse_args()

    if not 1 <= args.cutoff <= 255:
        parser.error("--cutoff must be between 1 and 255")

    if args.demo:
        values = [0, 1, 64, 127, 128, 254, 255]
        sample = Image.new("RGBA", (len(values), 1))
        sample.putdata([(80, 160, 220, a) for a in values])
        result = threshold_alpha(sample, args.cutoff)
        print([result.getpixel((x, 0))[3] for x in range(len(values))])
        return

    if not args.source.is_dir():
        parser.error("Source must be an existing folder")
    if args.destination.exists():
        parser.error("Destination must be a new folder")

    files = sorted(
        p for p in args.source.iterdir()
        if p.is_file() and p.suffix.lower() == ".png"
    )
    if not files:
        parser.error("No PNG frames found directly inside source")

    args.destination.mkdir(parents=True)
    for path in files:
        with Image.open(path) as image:
            if image.format != "PNG" or image.mode != "RGBA":
                raise ValueError(f"{path.name}: expected RGBA PNG")
            if getattr(image, "n_frames", 1) != 1:
                raise ValueError(f"{path.name}: expected a single frame")
            before = partial_count(image)
            result = threshold_alpha(image, args.cutoff)
            target = args.destination / path.name
            result.save(target, format="PNG")

        with Image.open(target) as saved:
            after = partial_count(saved)
            if saved.size != result.size or after != 0:
                raise RuntimeError(f"{target.name}: verification failed")
        print(f"{path.name}: partial pixels {before} -> {after}")


if __name__ == "__main__":
    main()

Jalankan contoh mandiri terlebih dahulu. Dalam mode demo, dua argumen folder diterima, tetapi tidak ada folder yang dibaca atau dibuat:

python alpha_clean.py unused_input unused_output --demo --cutoff 128

Program mencetak [0, 0, 0, 0, 255, 255, 255]. Pemetaan dasar untuk batas 1, 128, dan 255, nilai RGB yang tidak berubah, serta perilaku penyimpanan dan pembukaan kembali PNG diperiksa menggunakan sampel dalam memori dengan Pillow 13.0.0.

Untuk frame sebenarnya, letakkan PNG input Anda dalam folder bernama frames, lalu jalankan:

python alpha_clean.py frames frames_clean --cutoff 128

Gunakan --cutoff 255 untuk menghapus setiap piksel semi-transparan, atau --cutoff 1 untuk membuat setiap piksel yang terlihat menjadi solid. Pilih folder tujuan baru untuk setiap perbandingan.

Program ini berhenti jika menemukan input yang tidak didukung atau verifikasi gagal. Berkas yang selesai diproses sebelum terjadi kesalahan akan tetap berada di folder tujuan; folder tersebut merupakan hasil proses yang tidak lengkap. Perbaiki input lalu jalankan ulang ke folder baru lainnya. Program ini tidak memproses subfolder secara rekursif, tidak mempertahankan waktu animasi, dan bukan alat umum untuk mempertahankan metadata.

Bagian 5

Mengapa tepi yang sudah dibuat solid masih tampak gelap atau pucat?

Pembersihan alpha mengubah cakupan. Warna tepi perlu diperiksa secara terpisah. Microsoft membedakan alpha lurus, yaitu RGB dan alpha yang berdiri sendiri, dengan alpha premultiplikasi, yaitu RGB yang sudah dikalikan dengan alpha. Microsoft Learn: Alpha premultiplikasi

Sebagai perhitungan ilustratif, warna merah lurus (200, 0, 0) pada alpha 0.25 setara dengan RGB premultiplikasi (50, 0, 0). Jika nilai warna premultiplikasi tersebut keliru dianggap sebagai RGB lurus lalu alpha dinaikkan begitu saja menjadi 1, hasilnya adalah piksel merah gelap. Hal ini langsung mengikuti hubungan konversi yang didokumentasikan. Microsoft Learn: Alpha premultiplikasi

Alur kerja Python mengasumsikan input PNG RGBA dengan alpha lurus yang dikodekan dengan benar. Alur ini tidak dapat mendiagnosis warna yang dikodekan secara keliru atau merekonstruksi warna kontur yang dimaksud. Jika pembuatan piksel solid menampakkan pinggiran, periksa terlebih dahulu interpretasi alpha pada render atau ekspor asli. Jika warnanya sendiri tercemar oleh komposit latar sebelumnya, kembali ke render transparan yang bersih atau warnai ulang tepi yang terdampak.

Bandingkan frame yang sudah dibersihkan dengan latar terang dan gelap. Jumlah piksel parsial yang nol memastikan alpha bersifat biner; itu tidak memastikan warna tepinya sesuai untuk karakter tersebut.

Bagian 6

Bagaimana menjaga hasil pembersihan tetap utuh saat diekspor dan diputar?

Lakukan perubahan ukuran sebelum pembersihan alpha akhir. Resampling interpolasi dapat menghasilkan nilai menengah antara piksel transparan dan opak. Pillow menjelaskan bahwa resampling bilinear menghitung nilai melalui interpolasi, sedangkan resampling tetangga terdekat memilih piksel input yang sudah ada. Karena itu, pengubahan ukuran kanal alpha biner dengan tetangga terdekat mempertahankan kedua nilai ujungnya. Pillow: Konsep—Filter

Gunakan tetangga terdekat jika tampilan yang diinginkan memerlukan kisi piksel yang tegas. Untuk gaya visual lain, ubah ukuran dengan filter yang diinginkan terlebih dahulu, lalu terapkan threshold pada frame hasilnya dan periksa kembali konturnya. Jika ada proses penskalaan atau komposit berikutnya, periksa lagi hasil akhirnya.

Tinjau seluruh rangkaian dengan batas yang sama. Fitur tipis dapat melewati batas di antara frame yang berdekatan dan tampak berkedip meskipun setiap frame terlihat baik secara terpisah. Jika itu terjadi, periksa frame asli di sekitar perubahan tersebut dan perbaiki fitur itu secara konsisten pada frame-frame tersebut.

Sebelum menggunakan rangkaian, periksa kondisi berikut:

  • Setiap frame yang diharapkan tersedia, dengan nama berkas dan dimensi kanvas aslinya.
  • Setiap frame yang tersimpan memiliki nol piksel dengan alpha dari 1 hingga 254.
  • Detail kecil tetap terbaca pada ukuran tampilan yang diinginkan.
  • Pratinjau dengan latar terang dan gelap tidak menunjukkan pinggiran yang tidak diinginkan.
  • Pemutaran mempertahankan siluet yang konsisten sepanjang gerakan.

Pilih aturan alpha yang mempertahankan bentuk karakter yang diinginkan, terapkan secara konsisten, lalu periksa rangkaian hasil ekspor. Simpan render asli bersama frame yang sudah dibersihkan agar penyesuaian berikutnya dapat dimulai dari informasi transparansi yang lengkap.

Bagian 7

Sumber

Bacaan terkait

Lanjutkan topik ini