Побитовые операции на png и bmp дают разные результаты? (То же самое 32-битное представление ARGB) - PullRequest
1 голос
/ 22 июня 2009

Я пытаюсь скопировать некоторое программное обеспечение для фильтрации изображений на платформе Android. Настольная версия работает с bmps, но вылетает в файлах png.

Когда я прихожу к xOr двум изображениям (32-битные дюймы каждого соответствующего пикселя), я получаю очень разные результаты для двух частей программного обеспечения.

Я уверен, что мой код не ошибается, поскольку это такая простая задача, но вот она;

const int aMask = 0xFF000000;

int xOrPixels(int p1, int p2) {
    return (aMask | (p1 ^ p2) );
}

Определение библиотеки JAI, используемой настольным программным обеспечением Java, можно найти здесь и состояния;

 The destination pixel values are defined by the pseudocode:

 dst[x][y][b] = srcs[0][x][y][b] ^ srcs[1][x][y][b];

Где b для группы (то есть R, G, B).

Есть мысли? У меня похожая проблема с AND и OR.

Вот изображение с двумя исходными изображениями, которые xOr'd внизу на Android использует png. Тот же файл, что и растровое изображение xOr'd, дает мне растровое изображение, заполненное 0xFFFFFFFF (белым), без пикселей вообще. Я проверил двоичные значения Android ap, и мне кажется, что это правильно ....

Android

Гав

NB. Когда я говорю (то же самое 32-битное представление ARGB), я имею в виду, что android позволяет вам декодировать файл png в этот формат. Хотя это может дать место для некоторой ошибки (png без потерь?), Я получаю совершенно разные цвета на выходе.

Ответы [ 3 ]

0 голосов
/ 22 июня 2009

Что вы делаете перед отправкой кода?

PNG - это сжатый формат, использующий алгоритм дефляции (см. Раздел 5 RFC2083 ), поэтому, если вы просто выполняете двоичное чтение, вы не смотрите на фактическое пиксели.

0 голосов
/ 12 августа 2009

Я проверил пару значений из вашего скриншота.

Входные пиксели:

  • Верхний левый угол, 0xc3cbce ^ 0x293029 = 0xeafbe7
  • Задняя часть шеи, 0xbdb221 ^ 0x424dd6 = 0xfffff7

очень похожи на соответствующие выходные пиксели.

Похоже, вы XOR делаете два изображения, которые тесно связаны (инвертированы в каждом цветовом канале), поэтому выходной сигнал обязательно равен 0xffffff.

Если вы захотите сделать XOR двух разнородных изображений, возможно, вы получите нечто большее, чем вы ожидаете.

Вопрос в том, почему вы хотите XOR значения пикселей?

0 голосов
/ 22 июня 2009

PNG может иметь неправильную гамму или цветовое пространство, и он конвертируется при нагрузке, что влияет на результат. В некоторых версиях Photoshop была ошибка, при которой они сохраняли png с неправильной гаммой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...