Saya telah melihat di beberapa basis kode perangkat lunak komputer grafis bahwa kadang-kadang bit yang lebih tinggi dari data gambar format RGB565 direplikasi menjadi bit yang lebih rendah ketika mengkonversi ke format yang lebih tinggi-bit-kedalaman RGBA8888.
Saya telah menemukan misalnya komentar oleh pengguna "eq" di utas gamedev.net ini :
Saya lebih suka mereplikasi bit yang lebih tinggi ke dalam bit yang lebih rendah yang tidak terdefinisi:
R8 = (R5 << 3) | (R5 >> 2);
Namun saya tidak mengerti alasan di baliknya.
Apa gunanya tujuan mereplikasi bit-bit itu ke dalam data yang dikonversi?
Jawaban:
Tanpa mereplikasi bit LSBs akan menjadi 0, jadi untuk nilai maksimum 0x1f (maks untuk 5 bit) itu akan diperluas ke 0xf8 ketika dikonversi menjadi 8 bit. Yang Anda inginkan adalah 0xff sehingga kisaran 0x00-> 0x1f akan dipetakan ke 0x00-> 0xff alih-alih 0x00-> 0xf8. Tanpa menggabungkan LSB Anda tidak akan dapat mengkonversi 0x1f, 0x1f, 0x1f menjadi putih (0xff, 0xff, 0xff). Kebetulan ini sama dengan N * 0xff / 0x1f.
sumber
Sebenarnya ada alasan matematika yang cukup baik untuk melakukan replikasi bit:
Catatan pertama bahwa string n-bit,N , sebenarnya mewakili nilai N2n- 1 dan kami ingin menghasilkan string m-bit, M. dimana n < m dan
N2n- 1≈M.2m- 1
Kami pertama-tama skala pembilang dan penyebut denganN.(2n+ 1)(2n- 1 ) (2n+ 1 )≈M.2m- 1
dan ini disederhanakan menjadi
N. (2n+ 1 )22 n- 1≈M.2m- 1
Dalam kasus anda,n ∈ { 5 , 6 } dan m = 8 dan kita bisa "berhenti" di sini, tetapi prosesnya dapat diulangi (ad nauseum), jika m >> n.
Kami selanjutnya membuat perkiraan ...N. (2n+ 1 )22 n≈M.2m yang disederhanakan menjadi
N. (2n+ 1 )22 n - m≈ M.
Catat ituN. (2n+ 1 ) sama dengan mengulangi string n-bit, untuk membuat string 2n-bit, dan divisi bergeser dari 2 n - m LSB meninggalkan hasil bit M.
QED
Tentu saja, perhitungan yang 'benar' adalahM.= ⌊ ((2m- 1 ) N2n- 1+12⌋ tetapi perkiraan ini, secara umum, bekerja sebagian besar waktu. Tentu saja ada kalanya tidak akurat, tetapi IIRC hanya sedikit demi sedikit dan relatif jarang.
sumber