gpt4 book ai didi

c - "Unsigned modulo 256"在图像解码的上下文中意味着什么

转载 作者:太空狗 更新时间:2023-10-29 16:04:06 25 4
gpt4 key购买 nike

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

当我缩小的、未过滤的数据缓冲区中的内容明确无误地类似于源图像(见下文)时,我已经到了这样的地步,但它仍然非常,呃,错误,而且我很确定我的东西有些歪斜实现 filtering algorithms .其中大部分都非常简单,但在 docs 中有一件我不明白的主要事情,不擅长数学或曾经参加过 comp-sci 类(class):

Unsigned arithmetic modulo 256 is used, so that both the inputs and outputs fit into bytes.

这是什么意思

如果有人能告诉我,我将不胜感激!



作为引用,(我为蹩脚的 C 道歉)我在 docs 中描述的过滤算法的 noddy 实现看起来像:

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);
}
}


我看到的图像:

来源

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 位。

关于c - "Unsigned modulo 256"在图像解码的上下文中意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5751371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com