Rumah > Java > javaTutorial > Bagaimana untuk Mencapai Kuantiti Warna Berkesan untuk GIF Animasi di Java?

Bagaimana untuk Mencapai Kuantiti Warna Berkesan untuk GIF Animasi di Java?

Linda Hamilton
Lepaskan: 2024-11-28 22:16:13
asal
1017 orang telah melayarinya

How to Achieve Effective Color Quantization for Animated GIFs in Java?

Kuantiti Warna Berkesan untuk GIF Beranimasi

Di Java, algoritma kuantisasi yang anda nyatakan (ditemui di http://www.java2s.com /Code/Java/2D-Graphics-GUI/Anefficientcolorquantizationalgorithm.htm) nampaknya kurang ketepatan untuk imej dengan lebih daripada 256 warna. Untuk meningkatkan pengkuantitian warna, pertimbangkan alternatif berikut:

Algoritma Alternatif:

  • Potongan median
  • Populasi
  • K -bermaksud

Pendekatan untuk Kuantiti Pantas dan Cekap:

  • Tukar kepada RGB 15-bit (atau skema 5:6:5 untuk hasil yang lebih baik).
  • Buat histogram untuk mengira kejadian piksel.
  • Susun semula histogram untuk menghapuskan nilai sifar.
  • Isih histogram kepada susun warna dalam tertib menurun berdasarkan kiraan piksel.
  • Buat palet warna N, tambah hanya warna unik daripada histogram yang diisih sehingga palet selesai.
  • Peta setiap warna dalam imej asal kepada warna yang paling hampir dalam palet.
  • Warna semula imej menggunakan pemetaan warna jadual.

Kod Contoh dalam C :

// Histogram and index arrays
DWORD his[32768];
DWORD idx[32768];

// Recolor mapping table
BYTE recolor[32][32][32];

// Extract 15-bit RGB from 32-bit RGB
cc=((cc>>3)&0x1F)|((cc>>6)&0x3E0)|((cc>>9)&0x7C00);

// Histogram counting
his[cc]++;

// Reorder and sort histogram
for (x=0,y=0;y<32768;y++)
{
    his[x]=his[y];
    idx[x]=idx[y];
    if (his[x]) x++;
}
hists=x;
for (i=1;i;)
    for (i=0,x=0,y=1;y<hists;x++,y++)
        if (his[x]<his[y])
        {
            i=his[x]; his[x]=his[y]; his[y]=i;
            i=idx[x]; idx[x]=idx[y]; idx[y]=i; i=1;
        }

// Create color palette
for (i0=0,x=0;x<hists;x++)
{
    cc=idx[x];
    b= cc     &amp;31;
    g=(cc>> 5)&amp;31;
    r=(cc>>10)&amp;31;
    c0.db[0]=b;
    c0.db[1]=g;
    c0.db[2]=r;
    c0.dd=(c0.dd<<3)&amp;0x00F8F8F8;

    // Find closest color in palette
    int dc=-1; DWORD ii=0;
    for (a=0,i=0;i<i0;i++)
    {
        aa=int(BYTE(c1.db[0]))-int(BYTE(c0.db[0])); if (aa<=0) aa=-aa; a =aa;
        aa=int(BYTE(c1.db[1]))-int(BYTE(c0.db[1])); if (aa<=0) aa=-aa; a+=aa;
        aa=int(BYTE(c1.db[2]))-int(BYTE(c0.db[2])); if (aa<=0) aa=-aa; a+=aa;
        if ((dc<0)||(dc>a)) { dc=a; ii=i; }
    }
    recolor[r][g][b]=ii;
}

// Recolor image using mapping table
pyx [y][x]=lcolor[recolor[r][g][b]];
Salin selepas log masuk

Pendekatan ini menyediakan kuantisasi warna yang lebih pantas dan tepat. Algoritma dan parameter khusus untuk digunakan mungkin berbeza-beza bergantung pada imej input dan hasil yang diingini.

Atas ialah kandungan terperinci Bagaimana untuk Mencapai Kuantiti Warna Berkesan untuk GIF Animasi di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan