C# подпрограмма дизеринга изображения, которая принимает количество дизеринга?

Я использовал метод дизеринга floyed-steinberg от aforge, но заметил, что вы не можете указать количество дизеринга. Я хотел бы иметь возможность указать величину от 0 до 100. Так что, если я попрошу 50, он будет вдвое меньше, чем 100. Или, если я укажу 0, то полученное изображение будет состоять из сплошных цветов с твердыми краями между каждым цветом... или другими словами, не сглаживание. Я ищу код на C# для такой подпрограммы, как Флойед-Штейнберг или Джарвис, Джудис, Нинке Дизеринг, которая принимает сумму. кто-нибудь знает что-нибудь?

1 ответ

С небольшим изменением этого дизеринга вы можете достичь масштабируемости дизеринга. Просто масштабируйте цветной аккумулятор (остатки) 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 цветовой палитрой по умолчанию:

коэф = 100

коэф = ~75

коэф = ~50

коэф = 25

коэф = 0

[Заметки]

мой coef устанавливается полосой прокрутки, так что только 0% и 100% являются точными, все остальные коэффициенты могут быть рядом с выбранным значением.

Например, если вы измените диапазон коэффициентов на степень 2 <0,128> тогда вы можете использовать битовое смещение вместо деления при масштабировании.

Другие вопросы по тегам