Effektive Farbquantisierung für animierte GIFs
In Java ist der von Ihnen erwähnte Quantisierungsalgorithmus (zu finden unter http://www.java2s.com /Code/Java/2D-Graphics-GUI/Anefficientcolorquantizationalgorithm.htm) scheint für Bilder mit nicht präzise genug zu sein mehr als 256 Farben. Um die Farbquantisierung zu verbessern, ziehen Sie die folgenden Alternativen in Betracht:
Alternative Algorithmen:
Ansatz für schnelle und Effiziente Quantisierung:
Beispielcode in 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 &31; g=(cc>> 5)&31; r=(cc>>10)&31; c0.db[0]=b; c0.db[1]=g; c0.db[2]=r; c0.dd=(c0.dd<<3)&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]];
Dieser Ansatz ermöglicht eine schnellere und genauere Farbquantisierung. Der spezifische zu verwendende Algorithmus und die zu verwendenden Parameter können je nach Eingabebildern und gewünschten Ergebnissen variieren.
Das obige ist der detaillierte Inhalt vonWie erreicht man eine effektive Farbquantisierung für animierte GIFs in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!