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