Cara Membuang atau Menjadikan Piksel Separa Telus dalam Bingkai Watak yang Dirender Sepenuhnya Legap
Untuk membuang piksel separa telus daripada bingkai watak yang dirender, tukar nilai alphanya kepada sama ada telus sepenuhnya atau legap sepenuhnya. Pilih sama ada untuk memadam semua piksel yang separa telus, menjadikan semua piksel yang kelihatan legap sepenuhnya, atau menggunakan ambang yang mengekalkan bahagian garis luar yang lebih jelas.
Aliran kerja ini adalah untuk pencipta yang menyediakan bingkai PNG watak berlatar lutsinar dengan tepi yang jelas. Panduan ini merangkumi kaedah visual dalam GIMP dan kaedah Python yang boleh diulang untuk seluruh folder bingkai, termasuk pemeriksaan bagi memastikan imej yang dieksport tidak mengandungi nilai alpha perantaraan.
Apakah sebenarnya yang perlu diubah pada bingkai?
Bagi imej RGBA 8-bit, setiap piksel mempunyai komponen merah, hijau, biru dan alpha. Alpha 0 bermaksud telus sepenuhnya; alpha 255 bermaksud legap sepenuhnya. Nilai dari 1 hingga 254 adalah separa telus. Pillow mendokumenkan RGBA sebagai empat saluran 8-bit dengan topeng ketelusan. Pillow: Konsep
Oleh itu, bingkai mungkin kelihatan hampir legap sepenuhnya tetapi masih mengandungi banyak piksel separa telus. Sebelum mengedit, periksa salinan pada saiz paparan yang dimaksudkan dan dalam paparan piksel yang diperbesar. Letakkan latar cerah dan gelap di bawahnya buat sementara waktu. Perhatikan piksel luar yang samar, butiran halus yang hilang dan pinggiran warna.
Tentukan sama ada ketelusan separa patut dikekalkan dalam karya seni akhir. Aksesori lut cahaya atau bayang-bayang lembut akan berubah dengan ketara apabila dipaksa menjadi topeng legap atau telus. Jika hanya garis luar watak yang perlu diperbetulkan, asingkan kawasan atau lapisan itu sebelum menggunakan operasi menyeluruh.
Simpan bingkai asal yang dirender. Pengambangan meruntuhkan banyak nilai alpha kepada dua nilai hujung, jadi fail yang diproses tidak dapat menunjukkan tahap ketelusan asal piksel tersebut.
Patutkah anda membuang piksel separa telus atau menjadikannya legap sepenuhnya?
Gunakan satu peraturan yang jelas dan konsisten pada seluruh jujukan bingkai. Dalam jadual di bawah, C ialah nilai alpha minimum untuk dikekalkan, dan setiap piksel yang dikekalkan menjadi legap sepenuhnya. Peraturan ini menerangkan input 8-bit.
| Hasil yang dikehendaki | Peraturan | Pertukaran visual utama |
|---|---|---|
| Buang semua piksel separa telus | Kekalkan hanya alpha 255 | Butiran halus yang terdiri sepenuhnya daripada piksel separa telus akan hilang |
| Jadikan semua piksel yang kelihatan legap sepenuhnya | Kekalkan alpha 1–255 | Piksel luar yang samar menjadi sebahagian daripada siluet legap |
| Pilih garis luar pertengahan | Kekalkan alpha ≥ C; buang alpha < C | Ambang menentukan piksel tepi yang kekal |
Sebagai contoh, pertimbangkan nilai alpha ilustrasi 0, 1, 64, 127, 128, 254, 255. Dengan C = 128, output menjadi 0, 0, 0, 0, 255, 255, 255. Dengan C = 255, hanya piksel terakhir dikekalkan. Dengan C = 1, setiap piksel yang asalnya kelihatan menjadi legap sepenuhnya.
Mulakan dengan C = 128 sebagai titik perbandingan, kemudian periksa watak sebenar. Nilai ini ialah titik tengah yang mudah untuk dibandingkan, bukannya tetapan terbaik yang telah ditetapkan. Naikkannya jika piksel samar yang tidak diingini masih kelihatan; turunkannya jika butiran berguna hilang. Gunakan bingkai asal untuk setiap perbandingan.
Jika menaikkan ambang menghilangkan pinggiran tetapi juga memutuskan butiran penting, satu ambang menyeluruh tidak dapat mencapai kedua-dua matlamat. Betulkan butiran itu secara setempat atau asingkannya ke dalam topeng tersendiri sebelum memproses garis luar yang selebihnya.
Bagaimanakah anda mengambangkan alpha dalam GIMP?
GIMP 3 menyediakan Layer → Transparency → Threshold Alpha…. Fungsi ini bertindak pada satu lapisan, memerlukan saluran alpha dan tidak memberi kesan apabila Lock alpha channel diaktifkan. Nilai ambangnya berjulat dari 0 hingga 1: nilai yang melebihi ambang menjadi legap, manakala nilai yang sama dengan atau di bawahnya menjadi telus. GIMP: Ambang Alpha
- Buka salinan bingkai dan pilih lapisan watak.
- Pastikan lapisan itu mempunyai saluran alpha dan nyahaktifkan Lock alpha channel.
- Buka Layer → Transparency → Threshold Alpha….
- Pratonton ambang 0.5 untuk potongan titik tengah, atau 0 untuk menjadikan setiap piksel dengan alpha bukan sifar legap sepenuhnya.
- Periksa butiran kecil dan kontur luar sebelum menggunakan operasi itu.
- Eksport hasilnya sebagai PNG yang berasingan.
Bagi input 8-bit, ambang 254/255, kira-kira 0.996078, mengekalkan hanya piksel yang asalnya mempunyai alpha 255. Elakkan menetapkan ambang kepada 1 untuk tujuan ini: mengikut perbandingan ketat yang didokumenkan, alpha 1 juga berada pada nilai ambang lalu menjadi telus. GIMP: Ambang Alpha
Pastikan latar pemeriksaan sementara tidak termasuk dalam fail watak yang dieksport. Buka semula PNG selepas itu supaya anda dapat menilai hasil eksport serta dokumen yang boleh diedit.
Bagaimanakah anda boleh menggunakan peraturan yang sama pada setiap bingkai?
Untuk berbilang bingkai, gunakan pemetaan alpha yang tetap dan bukannya melaraskan setiap imej secara berasingan. Program Python lengkap berikut memproses fail PNG secara langsung dalam satu folder, mengekalkan nama dan dimensinya, lalu menyimpan hasilnya ke folder baharu.
Pasang Pillow dengan python -m pip install Pillow, kemudian simpan program itu sebagai alpha_clean.py. Sediakan bingkai PNG RGBA 8-bit yang berasingan dan statik. Sebelum menggunakan aliran kerja ini, eksport imej palet, hasil render berketepatan lebih tinggi atau jenis imej lain kepada format tersebut secara khusus.
Program ini mengekstrak alpha dengan getchannel, memetakannya melalui jadual carian dengan point, dan menggantikan alpha sahaja dengan putalpha. Operasi ini didokumenkan dalam rujukan modul Pillow Image.
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 sampel kendiri itu terlebih dahulu. Dalam mod demo, kedua-dua argumen folder diterima tetapi tiada folder dibaca atau dicipta:
python alpha_clean.py unused_input unused_output --demo --cutoff 128
Program itu mencetak [0, 0, 0, 0, 255, 255, 255]. Pemetaan asas untuk ambang 1, 128 dan 255, nilai RGB yang tidak berubah, serta tingkah laku menyimpan dan membuka semula PNG telah diperiksa dengan sampel dalam memori menggunakan Pillow 13.0.0.
Untuk bingkai sebenar, letakkan PNG input anda dalam folder bernama frames, kemudian jalankan:
python alpha_clean.py frames frames_clean --cutoff 128
Gunakan --cutoff 255 untuk memadam semua piksel separa telus, atau --cutoff 1 untuk menjadikan semua piksel yang kelihatan legap sepenuhnya. Pilih folder destinasi baharu bagi setiap perbandingan.
Program ini berhenti jika input tidak disokong atau pengesahan gagal. Fail yang selesai diproses sebelum ralat kekal dalam destinasi; folder itu ialah hasil larian yang tidak lengkap. Betulkan input dan jalankan semula ke folder baharu yang lain. Program ini tidak memproses subfolder secara rekursif atau mengekalkan pemasaan animasi, dan bukan alat umum untuk mengekalkan metadata.
Mengapakah tepi yang dijadikan legap sepenuhnya masih kelihatan gelap atau pucat?
Pembersihan alpha mengubah liputan. Warna tepi perlu diperiksa secara berasingan. Microsoft membezakan alpha lurus, apabila RGB dan alpha adalah bebas, daripada alpha prendarab, apabila RGB sudah didarab dengan alpha. Microsoft Learn: Alpha prendarab
Sebagai pengiraan ilustrasi, merah lurus (200, 0, 0) pada alpha 0.25 sepadan dengan RGB prendarab (50, 0, 0). Jika nilai warna prendarab itu tersalah anggap sebagai RGB lurus lalu alpha dinaikkan begitu sahaja kepada 1, hasilnya ialah piksel merah gelap. Ini mengikut terus hubungan penukaran yang didokumenkan. Microsoft Learn: Alpha prendarab
Aliran kerja Python mengandaikan input PNG RGBA alpha lurus yang dikodkan dengan betul. Ia tidak dapat mendiagnosis warna yang dikodkan secara salah atau membina semula warna garis luar yang dimaksudkan. Jika menjadikan piksel legap sepenuhnya menampakkan pinggiran, periksa dahulu tafsiran alpha pada render atau eksport asal. Jika warna itu sendiri tercemar oleh penggabungan latar terdahulu, gunakan render lutsinar yang bersih atau cat semula tepi yang terjejas.
Bandingkan bingkai yang dibersihkan pada latar cerah dan gelap. Kiraan sifar piksel separa membuktikan bahawa alpha adalah binari; ia tidak membuktikan bahawa warna tepi sesuai dengan watak itu.
Bagaimanakah anda memastikan pembersihan kekal selepas eksport dan main balik?
Lakukan perubahan saiz sebelum pembersihan alpha terakhir. Pensampelan semula interpolasi boleh menghasilkan nilai perantaraan antara piksel telus dengan piksel legap. Pillow menerangkan pensampelan semula dwilinear sebagai pengiraan nilai melalui interpolasi, manakala pensampelan semula jiran terdekat memilih piksel input sedia ada. Oleh itu, perubahan saiz saluran alpha binari menggunakan jiran terdekat mengekalkan dua nilai hujungnya. Pillow: Konsep—Penapis
Gunakan jiran terdekat apabila rupa yang dikehendaki memerlukan grid piksel yang diskret. Untuk gaya visual lain, ubah saiz dengan penapis yang dikehendaki dahulu, kemudian ambangkan bingkai yang terhasil dan periksa semula konturnya. Langkah penskalaan atau penggabungan selepas itu memerlukan pemeriksaan sekali lagi terhadap output akhir.
Semak keseluruhan jujukan dengan ambang yang sama. Ciri halus mungkin merentasi ambang antara bingkai yang bersebelahan lalu kelihatan berkelip-kelip, walaupun setiap bingkai kelihatan boleh diterima secara berasingan. Jika hal ini berlaku, periksa bingkai asal di sekitar perubahan itu dan baiki ciri tersebut secara konsisten pada bingkai-bingkai berkenaan.
Sebelum menggunakan jujukan itu, periksa syarat konkrit berikut:
- Setiap bingkai yang dijangka tersedia, dengan nama fail dan dimensi kanvas asalnya.
- Setiap bingkai yang disimpan mempunyai sifar piksel dengan alpha dari 1 hingga 254.
- Butiran kecil kekal jelas pada saiz paparan yang dimaksudkan.
- Pratonton pada latar cerah dan gelap tidak menunjukkan pinggiran yang tidak diingini.
- Main balik mengekalkan siluet yang koheren sepanjang gerakan.
Pilih peraturan alpha yang mengekalkan bentuk watak yang dimaksudkan, gunakannya secara konsisten dan periksa jujukan yang dieksport. Simpan render asal bersama bingkai yang dibersihkan supaya pelarasan kemudian boleh bermula daripada maklumat ketelusan yang lengkap.
