РЕДАКТИРОВАТЬ: Я понял это.Я должен был вычислить paeth для каждого отдельного байта, а не для всего пикселя.
Я попытался написать свою собственную библиотеку для чтения файлов PNG, однако я столкнулся со странным поведением при попытке фильтрации с помощью Paeth.
---------
| C | B |
---------
| A | x |
---------
Если вы не знали, чтобы вычислить значение пикселя x, алгоритм Паэта вычисляет
p = A + B - C
, а затем выбирает один из пикселей (A, B илиC) который находится ближе всего к p и сохраняет значение
y = x - Paeth(A, B, C)
. Чтобы декодировать изображение, вы должны принять закодированное значение y и добавить Paeth (A, B, C), чтобы получить x.
Вот моя проблема.Кажется, что алгоритм, который кодирует изображение, использует R, G и B. из разных пикселей.
Например, я знаю из GIMP, что пиксель должен быть таким же, как B, но иногда какой бы пиксель я не выбрал,Я могу не получить его равным требуемому пикселю.Как ни странно, это может быть сделано при выборе, скажем, красного значения пикселя A и синего и зеленого значений пикселя B.
Поскольку GIMP отображает изображение правильно, в моем коде должна быть ошибка. НО значения, введенные в функцию, верны, и моя функция Паэта также верна.Я рассчитал это вручную.
Также это происходит только на некоторых изображениях и некоторых пикселях.Опять же, я не знаю, почему.
В чем проблема?