/* * HaoRan ImageFilter Classes v0.3 * Copyright (C) 2012 Zhenjun Dai * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation. */ package com.marshalchen.common.uimodule.ImageFilter; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.IntBuffer; import java.text.SimpleDateFormat; import java.util.Date; import android.content.res.ColorStateList; import android.graphics.Color; import android.util.Log; public class ColorToneFilter implements IImageFilter{ double _hue ; double _saturation ; double[] _lum_tab = new double[256]; /// @name RGB <--> HLS (Hue, Lightness, Saturation). //@{ /** RGB --> HLS \n prgb - address of 24bpp or 32bpp pixel. */ static double[] RGBtoHLS (int rgb, double H, double L, double S) { int colorR = (rgb & 0x00FF0000) >> 16; int colorG = (rgb & 0x0000FF00) >> 8; int colorB = rgb & 0x000000FF; //Color color = Color.rgb(colorR, colorG, bluecolorB); int n_cmax = Math.max(colorR, Math.max(colorG, colorB)); int n_cmin = Math.min(colorR, Math.min(colorG, colorB)); L = (n_cmax + n_cmin) / 2.0 / 255.0 ; if (n_cmax == n_cmin) { S = 0.0; H = 0.0 ; return new double[] {H, L ,S}; } double r = colorR / 255.0, g = colorG / 255.0, b = colorB / 255.0, cmax = n_cmax / 255.0, cmin = n_cmin / 255.0, delta = cmax - cmin ; if (L < 0.5) S = delta / (cmax + cmin) ; else S = delta / (2.0 - cmax - cmin) ; if (colorR == n_cmax) H = (g-b) / delta ; else if (colorG == n_cmax) H = 2.0 + (b-r) / delta ; else H = 4.0 + (r-g) / delta ; H /= 6.0 ; if (H < 0.0) H += 1.0 ; return new double[] {H, L ,S}; } static int DoubleRGB_to_RGB (double r, double g, double b) { return Color.rgb(Image.SAFECOLOR((int)(r*255)), Image.SAFECOLOR((int)(g*255)), Image.SAFECOLOR((int)(b*255))) ; } static double HLS_Value (double n1, double n2, double h) { if (h > 6.0) h -= 6.0 ; else if (h < 0.0) h += 6.0 ; if (h < 1.0) return n1 + (n2 - n1) * h ; else if (h < 3.0) return n2 ; else if (h < 4.0) return n1 + (n2 - n1) * (4.0 - h) ; return n1 ; } /// HLS --> RGB. static int HLStoRGB (double H, double L, double S) { if ((!(S > 0)) && (!(S < 0))) // == 0 return DoubleRGB_to_RGB (L, L, L) ; double m1, m2 ; if (L > 0.5) m2 = L + S - L*S ; else m2 = L * (1.0 + S) ; m1 = 2.0*L - m2 ; double r = HLS_Value (m1, m2, H*6.0 + 2.0) ; double g = HLS_Value (m1, m2, H*6.0) ; double b = HLS_Value (m1, m2, H*6.0 - 2.0) ; return DoubleRGB_to_RGB (r,g,b) ; } /** Calculate grayscale value of pixel \n prgb - address of 24bpp or 32bpp pixel. */ static int GetGrayscale (int r, int g , int b) { return (int)((30*r + 59*g + 11*g) / 100) ; } public ColorToneFilter(int tone, int saturation) { double l = 0.0f ; double[] result = RGBtoHLS (tone, _hue, l, _saturation) ; _hue = result[0]; l = result[1]; _saturation = result[2]; _saturation = _saturation * (saturation/255.0) * (saturation/255.0) ; _saturation = ((_saturation < 1) ? _saturation : 1) ; for (int i=0 ; i < 256 ; i++) { int cr = Color.rgb(i,i,i) ; double h = 0.0f, ll = 0.0f, s = 0.0f ; result = RGBtoHLS (cr, h, ll, s) ; h = result[0]; ll = result[1]; s = result[2]; ll = ll * (1 + (128- Math.abs(saturation-128)) / 128.0 / 9.0) ; _lum_tab[i] = ((ll < 1) ? ll : 1) ; } }; //@Override public Image process(Image imageIn) { int r, g, b; for(int x = 0 ; x < imageIn.getWidth() ; x++){ for(int y = 0 ; y < imageIn.getHeight() ; y++){ r = imageIn.getRComponent(x, y); g = imageIn.getGComponent(x, y); b = imageIn.getBComponent(x, y); double l = _lum_tab[GetGrayscale(r, g, b)] ; int cr = HLStoRGB (_hue, l, _saturation) ; imageIn.setPixelColor(x, y, cr); } } return imageIn; } }