【问题标题】:c# image dithering routine that accepts an amount of dithering?c# 接受一定数量的抖动的图像抖动例程?
【发布时间】:2015-10-04 23:03:05
【问题描述】:

我一直在使用 aforge 的 floyed-steinberg 抖动方法,但我注意到您无法指定抖动量。我希望能够指定 0 到 100 之间的数量。所以如果我要求 50,它会抖动 100 的一半。或者,如果我指定 0,那么生成的图像将由纯色组成每种颜色之间都有硬边……或者换句话说,没有抖动。我正在寻找接受金额的例程的 c# 代码,例如 floyed-steinberg 或 Jarvis、Judice、Ninke 抖动。有人知道吗?

【问题讨论】:

    标签: image colors dithering


    【解决方案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 = &lt;0,100&gt; 是您的体重秤。链接答案中代码的唯一变化是添加了 3 行用于缩放抖动。以下示例使用 VGA 256 色默认调色板:

    系数 = 100

    系数 = ~75

    系数 = ~50

    系数 = ~25

    系数 = 0

    [备注]

    我的coef 由滚动条设置,因此只有 0% 和 100% 是精确的,所有其他系数都可能接近所选值。

    如果您将系数范围更改为 2 的幂,例如 &lt;0,128&gt;,那么您可以在缩放时使用位移而不是除法。

    【讨论】:

    • 甜蜜。甜的。甜!
    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多