Резкость изображения Android, насыщенность, оттенок, яркость и контраст - PullRequest
3 голосов
/ 24 июня 2011

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

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

1 Ответ

4 голосов
/ 26 июня 2011

Да, в 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

...