Сделайте фильтр Гаусса устойчивым к переменной глубине цвета

Я пишу фильтр Гаусса для Android.

Согласно примеру GaussFilter из этого руководства: http://www.jhlabs.com/ip/blurring.html Я редактирую свое значение ALPHA следующим образом

alpha += f * ((pixelValue >> 24) & 0xff);

Согласно этой теме: Использование логического битового сдвига для значений RGB

 (pixelValue >>24 & 0xff);

не эквивалентен

Color.alpha(pixelValue);

Насколько я знаю, в RGB альфа-канал необязателен. Так что это зависит от глубины, как я читаю и редактирую значения alpha и rgb.

Существует множество комбинаций для разной глубины цвета, например:

  • 4 бит без альфы
  • 4 бит + 4 бит альфа
  • 24 бит, включая альфа (?)
  • Macintosh предлагает 24-битную плюс (или включая?) 8-битную альфа-версию.

Поскольку я не знаю, какой тип изображения хочет обработать пользователь, я должен перехватить все комбинации. Я бы просто использовал Color.Red(значение), Color.Green(значение)... но я не уверен, что в конце концов это будет слишком медленно? Я мог бы преобразовать каждый ввод в 24-битное растровое изображение перед обработкой, но это заняло бы слишком много времени.

Любая помощь приветствуется, спасибо.


person Goot    schedule 05.11.2012    source источник


Ответы (1)


  1. Прежде всего, если вы беспокоитесь о производительности, вы должны внедрить ее и измерить.

  2. Если вам нужна максимально быстрая реализация, вам в значительной степени придется специализировать ее для каждого формата пикселей. Но скорее всего вам нужно обрабатывать только один, см. ниже.

  3. С другой стороны, если вы загружаете растровое изображение как экземпляр класса Bitmap, есть только 4 возможных формата пикселей, и ARGB_8888, вероятно, единственный, о котором вам следует заботиться (возможно, RGB_565 тоже, но я не ожидаю хорошего эффекта размытия с таким небольшим значением бит на пиксель). На самом деле растровые изображения по умолчанию загружаются с конфигурацией ARGB_8888 в соответствии с BitmapFactory. Документация по параметрам. Другими словами, при использовании стандартного Android-API для обработки растровых изображений вам не нужно выполнять никаких преобразований, это делается за вас — просто укажите нужный формат.

  4. На самом деле (pixelValue >>24 & 0xff); и Color.alpha(pixelValue); эквивалентны для формата ARGB_8888 пикселей, однако это можно сделать лучше.

Используя оператор логического сдвига (в отличие от >>, арифметического сдвига), вам вообще не нужна операция & 0xFF, так как биты 31..8 всегда равны 0. Посмотрите, как реализован Color.alpha():

public static int alpha(int color) {
    return color >>> 24;
}
person Code Painters    schedule 12.11.2012
comment
Пожалуйста. Есть ли что-нибудь еще, что я мог бы объяснить больше? В любом случае награда ждет ;) - person Code Painters; 13.11.2012
comment
Мне нужно подождать еще 2 часа, пока вы не получите награду;) - person Goot; 13.11.2012
comment
Ты сделал мой день, rotfl :) - person Code Painters; 13.11.2012