Резкость изображения Android, насыщенность, оттенок, яркость и контраст

Я пытаюсь создать приложение, которое позволит мне регулировать оттенок, насыщенность, яркость, контрастность и резкость изображения, настраивая полосы поиска для каждого из указанных выше полей. как на http://ronbigelow.com/articles/workflow_basic/hue-saturation_tool.jpg

Я понятия не имею, как это сделать, и я не могу найти учебники в Интернете. Есть ли в Android что-нибудь, что уже делает это? Нужно ли манипулировать цветами отдельных пикселей? Если бы мне пришлось возиться с пикселями, как бы я это сделал?

1 ответ

Да, в Android есть некоторые инструменты для манипулирования цветами, некоторые проще, чем другие. Единственный способ сделать то, что вы просите об общем пространстве всех изображений, - это изменить отдельные пиксели. Есть другие быстрые и грязные трюки, которые намного быстрее, но гораздо менее точны (ColorFilter).

Переключатель оттенка:

private Bitmap adjustedHue(Bitmap o, int deg)
{
   Bitmap srca = o;
   Bitmap bitmap = srca.copy(Bitmap.Config.ARGB_8888, true);
   for(int x = 0;x < bitmap.getWidth();x++)
       for(int y = 0;y < bitmap.getHeight();y++){
               int newPixel = hueChange(bitmap.getPixel(x,y),deg);
               bitmap.setPixel(x, y, newPixel);
       }

   return bitmap;
}
private int hueChange(int startpixel,int deg){
   float[] hsv = new float[3];       //array to store HSV values
   Color.colorToHSV(startpixel,hsv); //get original HSV values of pixel
   hsv[0]=hsv[0]+deg;                //add the shift to the HUE of HSV array
   hsv[0]=hsv[0]%360;                //confines hue to values:[0,360]
   return Color.HSVToColor(Color.alpha(startpixel),hsv);
}

Отсюда насыщенность / яркость тривиальны. Но, хотя все это получит то, что вы хотите, это довольно медленно. Функция getPixel() особенно интенсивна. Я бы рекомендовал сначала "кэшировать" пиксели, если вы собираетесь изменять эти вещи в режиме реального времени. Например, если сначала сохранить все значения HUE, SATURATION, VALUE и ALPHA как 2d-массивы, и вызывать их, а не вызывать getPixel() и Color.colorToHSV() при каждом незначительном изменении, это значительно ускорит код.

Кроме того, функция bitmap.getPixels() работает для меня намного лучше. Вы можете сохранить массив, который он создает первым, а затем выполнить итерацию по нему.

Теперь, в то время как яркость / контрастность могут быть сделаны с использованием аналогичных методов для конкретных пикселей (умножьте V на некоторое значение и добавьте некоторое смещение) ... резкость не так проста. Резкость не является изолированной цветовой модификацией, это модификация самой картинки (называемая "свертка"). То есть преобразование должно знать что-то о соседних пикселях, чтобы работать. Я не знаю о встроенной функции Android для этого. Но это можно сделать несколькими способами.

Если вам нужна функция "повышения резкости", я сначала попробую функцию "размытия". Это похожий процесс, но он более интуитивно понятен (и круче). И вы можете на самом деле резкость изображения с помощью размытия. Этот парень очень хорошо объясняет все это для использования в Java (с источником / апплетами):

http://www.jhlabs.com/ip/blurring.html

Другие вопросы по тегам