"无符号模256"在图像解码的上下文中意味着什么

Mik*_*ame 3 c png filtering

因为我是受虐狂我正试图在C中写一些东西来解码一个8位的PNG文件(这是一个学习的东西,我不是要重新发明libpng ......)

我已经到了这一点,当我放气的,未经过滤的数据缓冲区中的东西明显地类似于源图像(见下文),但它仍然非常,错误,错误,而且我很确定我的实现方式有些歪斜过滤算法.他们中的大多数都很简单,但在文档中有一件我不理解的重要事情,就是不擅长数学或者没有参加过comp-sci课程:

使用无符号算术模256,因此输入和输出都适合字节.

这是什么意思

如果有人能告诉我,我会非常感激!



作为参考,(我为蹩脚的C道歉)我在文档中描述的过滤算法的点头实现如下:

unsigned char paeth_predictor (unsigned char a, unsigned char b, unsigned char c) {
    // a = left, b = above, c = upper left
    char p = a + b - c; //  initial estimate
    char pa = abs(p - a);    //  distances to a, b, c
    char pb = abs(p - b);
    char pc = abs(p - c);
    // return nearest of a,b,c,
    // breaking ties in order a,b,c.
    if (pa <= pb && pa <= pc) return a;
    else if (pb <= pc) return b;
    else return c;
}

void unfilter_sub(char* out, char* in, int bpp, int row, int rowlen) {
    for (int i = 0; i < rowlen; i++)
        out[i] = in[i] + (i < bpp ? 0 : out[i-bpp]);
}

void unfilter_up(char* out, char* in, int bpp, int row, int rowlen) {
    for (int i = 0; i < rowlen; i++)
        out[i] = in[i] + (row == 0 ? 0 : out[i-rowlen]);
}

void unfilter_paeth(char* out, char* in, int bpp, int row, int rowlen) {
    char a, b, c;
    for (int i = 0; i < rowlen; i++) {
        a = i < bpp ? 0 : out[i - bpp];
        b = row < 1 ? 0 : out[i - rowlen];
        c = i < bpp ? 0 : (row == 0 ? 0 : out[i - rowlen - bpp]);
        out[i] = in[i] + paeth_predictor(a, b, c);
    }
}              
Run Code Online (Sandbox Code Playgroud)



我看到的图像:

资源

来源http://img220.imageshack.us/img220/8111/testdn.png

产量

输出http://img862.imageshack.us/img862/2963/helloworld.png

Lig*_*ica 6

这意味着,在算法中,无论何时执行算术运算,都以256执行,即如果结果大于256则则"包裹".结果是所有值总是适合8位而不是溢出.

无符号类型已经通过授权以这种方式运行,并且如果使用unsigned char(并且系统上的一个字节是8位,它可能是),那么您的计算结果自然不会溢出超过8位.