Резкость изображения 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 (с источником / апплетами):