package com.jarlen.utils;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.Bitmap.Config;
public class FrameFilterUtils
{
static int alpha(int color)
{
return (color & 0xFF000000) >> 24;
}
static int red(int color)
{
return (color & 0xFF0000) >> 16;
}
static int green(int color)
{
return (color & 0xFF00) >> 8;
}
static int blue(int color)
{
return color & 0xFF;
}
static int ARGB(int alpha, int red, int green, int blue)
{
return (alpha << 24) | (red << 16) | (green << 8) | blue;
}
int RGB(int red, int green, int blue)
{
return 255 << 24 | red << 16 | green << 8 | blue;
}
float Max(float x, float y)
{
return x > y ? x : y;
}
float Min(float x, float y)
{
return x > y ? y : x;
}
public static Bitmap ResizeBitmap(Bitmap bitmap, int newWidth, int newHeight)
{
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height,
matrix, true);
bitmap.recycle();
return resizedBitmap;
}
/**
* PS 滤色(BLEND_SCREEN)
*
* @param baseColor
* @param overlayColor
* @return
*
* 漏光效果
*/
public static int getLayerBlendingScreen(int baseColor, int overlayColor,
double factor)
{
int baseColor_a = alpha(baseColor);
int baseColor_r = red(baseColor);
int baseColor_g = green(baseColor);
int baseColor_b = blue(baseColor);
int overlayColor_a = alpha(overlayColor);
int overlayColor_r = red(overlayColor);
int overlayColor_g = green(overlayColor);
int overlayColor_b = blue(overlayColor);
int a, r = 0, g = 0, b = 0;
r = (int) (255 - (255 - baseColor_r) * (255 - overlayColor_r * factor)
/ 255);
g = (int) (255 - (255 - baseColor_g) * (255 - overlayColor_g * factor)
/ 255);
b = (int) (255 - (255 - baseColor_b) * (255 - overlayColor_b * factor)
/ 255);
return ARGB(baseColor_a, r, g, b);
}
/**
* 正片叠底(BLEND_MULTIPLY)
*
* @param baseColor
* @param overlayColor
* @param factor
* @return
*/
public static int getLayerBlendingMultiply(int baseColor, int overlayColor,
double factor)
{
int baseColor_a = alpha(baseColor);
int baseColor_r = red(baseColor);
int baseColor_g = green(baseColor);
int baseColor_b = blue(baseColor);
int overlayColor_a = alpha(overlayColor);
int overlayColor_r = red(overlayColor);
int overlayColor_g = green(overlayColor);
int overlayColor_b = blue(overlayColor);
int a = 0, r = 0, g = 0, b = 0;
a = baseColor_a;
r = baseColor_r * overlayColor_r / 255;
g = baseColor_g * overlayColor_g / 255;
b = baseColor_b * overlayColor_b / 255;
return ARGB(a, r, g, b);
}
/**
* 柔光
*
* @param colorA
* @param colorB
* @return 油画,a1map
*/
public static int getLayerBlendingSoftLight(int colorA, int colorB)
{
int c = 0;
// int colorB_a = alpha(colorB);
int colorB_r = red(colorB);
int colorB_g = green(colorB);
int colorB_b = blue(colorB);
int colorB_gray = (299 * colorB_r + 587 * colorB_g + 114 * colorB_b) / 1000;
int colorA_a = alpha(colorA);
int colorA_r = red(colorA);
int colorA_g = green(colorA);
int colorA_b = blue(colorA);
int a, r, g, b;
if (colorB_gray > 128)
{
r = (int) (colorA_r * (255 - colorB_r) / 128 + Math
.sqrt(colorA_r / 255.0) * (2 * colorB_r - 255));
g = (int) (colorA_g * (255 - colorB_g) / 128 + Math
.sqrt(colorA_g / 255.0) * (2 * colorB_g - 255));
b = (int) (colorA_b * (255 - colorB_b) / 128 + Math
.sqrt(colorA_b / 255.0) * (2 * colorB_b - 255));
} else
{
r = (int) (colorA_r * colorB_r / 128.0 + Math.pow(colorA_r / 255.0,
2) * (255 - 2 * colorB_r));
g = (int) (colorA_g * colorB_g / 128.0 + Math.pow(colorA_g / 255.0,
2) * (255 - 2 * colorB_g));
b = (int) (colorA_b * colorB_b / 128.0 + Math.pow(colorA_b / 255.0,
2) * (255 - 2 * colorB_b));
}
return ARGB(colorA_a, r, g, b);
}
public static int getLayerBlendingLighten(int baseColor, int overlayColor)
{
int baseColor_a = alpha(baseColor);
int baseColor_r = red(baseColor);
int baseColor_g = green(baseColor);
int baseColor_b = blue(baseColor);
int baseColorGray = (299 * baseColor_r + 587 * baseColor_g + 114 * baseColor_b) / 1000;
int overlayColor_a = alpha(overlayColor);
int overlayColor_r = red(overlayColor);
int overlayColor_g = green(overlayColor);
int overlayColor_b = blue(overlayColor);
int overlayColorGray = (299 * overlayColor_r + 587 * overlayColor_g + 114 * overlayColor_b) / 1000;
int a, r = 0, g = 0, b = 0;
if (baseColorGray >= overlayColorGray)
{
r = baseColor_r;
g = baseColor_g;
b = baseColor_b;
} else
{
r = overlayColor_r;
g = overlayColor_g;
b = overlayColor_b;
}
return ARGB(baseColor_a, r, g, b);
}
public static Bitmap getTestFilter(Bitmap base,Bitmap overlay)
{
int width = base.getWidth();
int height = overlay.getHeight();
int[] basePixels = new int[width * height];
int[] overlayPixels = new int[width * height];
base.getPixels(basePixels, 0, width, 0, 0, width, height);
overlay.getPixels(overlayPixels, 0, width, 0, 0, width, height);
int[] result = new int[width * height];
for(int i = 0; i < width;i++)
{
for(int j = 0;j < height;j++)
{
int BaseColor = basePixels[i * height + j];
int overlayColor = overlayPixels[i * height + j];
int color = getLayerBlendingSoftLight(BaseColor, overlayColor);
result[i * height + j] = color;
}
}
Bitmap tempBitmap = Bitmap.createBitmap(result, width, height,
Config.ARGB_8888);
return tempBitmap;
}
}