“无符号模256”在图像解码的上下文中意味着什么
因为我是受虐狂我正试图在C中写一些东西来解码一个8位的PNG文件(这是一个学习的东西,我不是要重新发明libpng ……)
我已经到了这一点,当我放气的,未经过滤的数据缓冲区中的东西明显地类似于源图像(见下文),但它仍然非常,错误,而且我很确定我的实现方式有些歪斜filtering algorithms.他们中的大多数都很简单,但是在docs中有一件我不理解的重要事情,就是不擅长数学或者没有参加过comp-sci课程:
那是什么意思? 如果有人能告诉我,我会非常感激! 作为参考,(我为蹩脚的C道歉)我在docs中描述的过滤算法的点头实现如下: 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,c,// breaking ties in order a,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,int rowlen) { for (int i = 0; i < rowlen; i++) out[i] = in[i] + (row == 0 ? 0 : out[i-rowlen]); } void unfilter_paeth(char* out,int rowlen) { char a,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,c); } } 我看到的图像: 资源 Source http://img220.imageshack.us/img220/8111/testdn.png 产量 Output http://img862.imageshack.us/img862/2963/helloworld.png 解决方法
这意味着,在算法中,无论何时执行算术运算,都以256为模执行,即如果结果大于256然后是
it “wraps” around.结果是所有值总是适合8位而不是溢出.
无符号类型已经通过授权以这种方式运行,并且如果使用unsigned char(并且系统上的一个字节是8位,它可能是),那么您的计算结果自然永远不会溢出超过8位. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |