我一直在使用aforge的floyed-steinberg抖动方法,但我注意到你无法指定抖动量。我希望能够指定介于0和100之间的数量。因此,如果我要求50,它将抖动一半到100。或者,如果我指定0,则生成的图像将由纯色,每种颜色之间有坚硬的边缘......换句话说,没有抖动。我正在寻找c#代码,例如floyed-steinberg,或贾维斯,Judice,Ninke dithering等接受金额的例行程序。有人知道吗?
答案 0 :(得分:1)
稍微更改此dithering即可实现抖动可伸缩性。只需按比例r0,g0,b0
<0,1>
示例(GIF)动画:
这里只是C ++抖动部分(其余部分在上面的链接中)
// 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;
}
coef = <0,100>
是您的比例。链接答案中代码的唯一变化是为比例抖动添加了3行。这里的示例包含 VGA 256色默认调色板:
coef = 100
coef = ~75
coef = ~50
coef = ~25
coef = 0
<强> [注释] 强>
我的coef
由滚动条设置,因此只有0%和100%是精确的,所有其他系数都可以接近选定值。
如果将系数范围更改为2的幂,例如<0,128>
,则可以在缩放时使用位移而不是除法。