image - steinberg - dithering meaning
¿rutina de dithering de imagen c#que acepta una cantidad de difuminado? (1)
He estado usando el método de difuminado floping-steinberg de forforge, pero noté que no se puede especificar la cantidad de tramado. Me gustaría poder especificar una cantidad entre 0 y 100. Por lo tanto, si solicito 50, dither la mitad tanto como 100. O, si especifico 0, entonces la imagen resultante estará hecha de colores sólidos con bordes duros entre cada color ... o en otras palabras, sin tramado. Estoy buscando c # code para una rutina como floyed-steinberg, o Jarvis, Judice, Ninke dithering, que acepta una cantidad. Alguien sabe de alguno?
con un ligero cambio de este difuminado puede lograr la escalabilidad de difuminado. Simplemente escale el acumulador de color (restos) r0,g0,b0
según su escala <0,1>
Ejemplo de animación (GIF):
Aquí solo la parte de tramado C ++ (el resto está en el enlace de arriba)
// dithering
r0=0; g0=0; b0=0; // no leftovers
for (y=0;y<pic0.ys;y++)
for (x=0;x<pic0.xs;x++)
{
// get source pixel color
c=pic0.p[y][x];
// add to leftovers
r0+=WORD(c.db[picture::_r]);
g0+=WORD(c.db[picture::_g]);
b0+=WORD(c.db[picture::_b]);
// find closest color from pal[]
for (i=0,j=-1;i<pal.num;i++)
{
c=pal[i];
r=WORD(c.db[picture::_r]);
g=WORD(c.db[picture::_g]);
b=WORD(c.db[picture::_b]);
e=(r-r0); e*=e; d =e;
e=(g-g0); e*=e; d+=e;
e=(b-b0); e*=e; d+=e;
if ((j<0)||(d0>d)) { d0=d; j=i; }
}
// get selected palette color
c=pal[j];
// sub from leftovers
r0-=WORD(c.db[picture::_r]);
g0-=WORD(c.db[picture::_g]);
b0-=WORD(c.db[picture::_b]);
// scale dithering
r0=(r0*coef)/100;
g0=(g0*coef)/100;
b0=(b0*coef)/100;
// copy to destination image
pic2.p[y][x]=c;
}
Donde coef = <0,100>
es su escala. El único cambio del código en la respuesta vinculada se agrega 3 líneas para tramado de escala. Aquí ejemplos con la paleta predeterminada de VGA 256 colores:
coef = 100
coef = ~ 75
coef = ~ 50
coef = ~ 25
coef = 0
[Notas]
Mi coef
está configurado por una barra de desplazamiento, por lo que solo el 0% y el 100% son precisos; todos los demás coeficientes podrían estar cerca del valor seleccionado.
Si cambia el rango del coeficiente a la potencia de 2, por ejemplo, <0,128>
, puede usar los cambios de bits en lugar de la división durante el escalado.