some filters fix + added more filters codebase
This commit is contained in:
@@ -0,0 +1,98 @@
|
|||||||
|
package ru.vtosters.lite.ui.wallpapers;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.Color;
|
||||||
|
|
||||||
|
public class ConvolutionMatrix{
|
||||||
|
public static final int SIZE = 3;
|
||||||
|
|
||||||
|
public double[][] Matrix;
|
||||||
|
public double Factor = 1;
|
||||||
|
public double Offset = 1;
|
||||||
|
|
||||||
|
public ConvolutionMatrix(int size){
|
||||||
|
Matrix = new double[size][size];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Bitmap computeConvolution3x3(Bitmap src, ConvolutionMatrix matrix){
|
||||||
|
int width = src.getWidth();
|
||||||
|
int height = src.getHeight();
|
||||||
|
Bitmap result = Bitmap.createBitmap(width, height, src.getConfig());
|
||||||
|
|
||||||
|
int A, R, G, B;
|
||||||
|
int sumR, sumG, sumB;
|
||||||
|
int[][] pixels = new int[SIZE][SIZE];
|
||||||
|
|
||||||
|
for (int y = 0; y < height - 2; ++y) {
|
||||||
|
for (int x = 0; x < width - 2; ++x) {
|
||||||
|
|
||||||
|
// get pixel matrix
|
||||||
|
for (int i = 0; i < SIZE; ++i) {
|
||||||
|
for (int j = 0; j < SIZE; ++j) {
|
||||||
|
pixels[i][j] = src.getPixel(x + i, y + j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get alpha of center pixel
|
||||||
|
A = Color.alpha(pixels[1][1]);
|
||||||
|
|
||||||
|
// init color sum
|
||||||
|
sumR = sumG = sumB = 0;
|
||||||
|
|
||||||
|
// get sum of RGB on matrix
|
||||||
|
for (int i = 0; i < SIZE; ++i) {
|
||||||
|
for (int j = 0; j < SIZE; ++j) {
|
||||||
|
sumR += (Color.red(pixels[i][j]) * matrix.Matrix[i][j]);
|
||||||
|
sumG += (Color.green(pixels[i][j]) * matrix.Matrix[i][j]);
|
||||||
|
sumB += (Color.blue(pixels[i][j]) * matrix.Matrix[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get final Red
|
||||||
|
R = (int) (sumR / matrix.Factor + matrix.Offset);
|
||||||
|
if (R < 0) {
|
||||||
|
R = 0;
|
||||||
|
} else if (R > 255) {
|
||||||
|
R = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get final Green
|
||||||
|
G = (int) (sumG / matrix.Factor + matrix.Offset);
|
||||||
|
if (G < 0) {
|
||||||
|
G = 0;
|
||||||
|
} else if (G > 255) {
|
||||||
|
G = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get final Blue
|
||||||
|
B = (int) (sumB / matrix.Factor + matrix.Offset);
|
||||||
|
if (B < 0) {
|
||||||
|
B = 0;
|
||||||
|
} else if (B > 255) {
|
||||||
|
B = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply new pixel
|
||||||
|
result.setPixel(x + 1, y + 1, Color.argb(A, R, G, B));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// final image
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAll(double value){
|
||||||
|
for (int x = 0; x < SIZE; ++x) {
|
||||||
|
for (int y = 0; y < SIZE; ++y) {
|
||||||
|
Matrix[x][y] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void applyConfig(double[][] config){
|
||||||
|
for (int x = 0; x < SIZE; ++x) {
|
||||||
|
for (int y = 0; y < SIZE; ++y) {
|
||||||
|
Matrix[x][y] = config[x][y];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,894 @@
|
|||||||
|
package ru.vtosters.lite.ui.wallpapers;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getPreferences;
|
||||||
|
import static ru.vtosters.lite.utils.Globals.getResources;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BlurMaskFilter;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.ColorFilter;
|
||||||
|
import android.graphics.LightingColorFilter;
|
||||||
|
import android.graphics.LinearGradient;
|
||||||
|
import android.graphics.Matrix;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.PorterDuff;
|
||||||
|
import android.graphics.PorterDuffXfermode;
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.graphics.RectF;
|
||||||
|
import android.graphics.Shader;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
|
||||||
|
import com.vk.medianative.MediaNative;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class ImageFilters{
|
||||||
|
public static final double PI = 3.14159d;
|
||||||
|
public static final double HALF_CIRCLE_DEGREE = 180d;
|
||||||
|
public static final double RANGE = 256d;
|
||||||
|
public static final int COLOR_MIN = 0x00;
|
||||||
|
public static final int COLOR_MAX = 0xFF;
|
||||||
|
|
||||||
|
public static Drawable getBlurredWallpaper(Drawable orig, int radius){
|
||||||
|
try {
|
||||||
|
if (orig == null) return null;
|
||||||
|
if (!(orig instanceof BitmapDrawable)) return orig; // we need only BitmapDrawable
|
||||||
|
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
|
||||||
|
MediaNative.blurBitmap(instance, radius);
|
||||||
|
return new BitmapDrawable(getResources(), instance);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return orig;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Drawable getMosaic(Drawable orig){
|
||||||
|
int scale = 100;
|
||||||
|
|
||||||
|
if (orig == null) return null;
|
||||||
|
if (!(orig instanceof BitmapDrawable)) return orig;
|
||||||
|
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
|
||||||
|
String radius = getPreferences().getString("msg_mosaic", "disabled");
|
||||||
|
|
||||||
|
switch(radius) {
|
||||||
|
case "high":
|
||||||
|
scale = 25;
|
||||||
|
break;
|
||||||
|
case "med":
|
||||||
|
scale = 50;
|
||||||
|
break;
|
||||||
|
case "low":
|
||||||
|
scale = 75;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bitmap temp = Bitmap.createScaledBitmap(instance, scale, scale, false);
|
||||||
|
Bitmap mosaicBitmap = Bitmap.createScaledBitmap(temp, instance.getWidth(), instance.getHeight(), false);
|
||||||
|
|
||||||
|
return new BitmapDrawable(getResources(), mosaicBitmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Drawable getDimmed(Drawable orig){
|
||||||
|
if (orig == null) return null;
|
||||||
|
if (!(orig instanceof BitmapDrawable)) return orig;
|
||||||
|
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
|
||||||
|
String radius = getPreferences().getString("msg_dim", "disabled");
|
||||||
|
switch(radius) {
|
||||||
|
case "dim_black":
|
||||||
|
darken(instance);
|
||||||
|
case "dim_white":
|
||||||
|
lighten(instance);
|
||||||
|
}
|
||||||
|
return new BitmapDrawable(getResources(), instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Drawable getMonochrome(Drawable orig){
|
||||||
|
if (orig == null) return null;
|
||||||
|
if (!(orig instanceof BitmapDrawable)) return orig;
|
||||||
|
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
|
||||||
|
|
||||||
|
Bitmap bwBitmap = Bitmap.createBitmap(instance.getWidth(), instance.getHeight(), Bitmap.Config.RGB_565);
|
||||||
|
float[] hsv = new float[3];
|
||||||
|
for (int col = 0; col < instance.getWidth(); col++) {
|
||||||
|
for (int row = 0; row < instance.getHeight(); row++) {
|
||||||
|
Color.colorToHSV(instance.getPixel(col, row), hsv);
|
||||||
|
if (hsv[2] > 0.5f) {
|
||||||
|
bwBitmap.setPixel(col, row, 0xffffffff);
|
||||||
|
} else {
|
||||||
|
bwBitmap.setPixel(col, row, 0xff000000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new BitmapDrawable(getResources(), bwBitmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void darken(Bitmap bm){
|
||||||
|
Canvas canvas = new Canvas(bm);
|
||||||
|
Paint p = new Paint(Color.RED);
|
||||||
|
ColorFilter filter = new LightingColorFilter(0xFF7F7F7F, 0x00000000); // darken
|
||||||
|
p.setColorFilter(filter);
|
||||||
|
canvas.drawBitmap(bm, new Matrix(), p);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void lighten(Bitmap bm){
|
||||||
|
Canvas canvas = new Canvas(bm);
|
||||||
|
Paint p = new Paint(Color.RED);
|
||||||
|
ColorFilter filter = new LightingColorFilter(0xFFFFFFFF, 0x00222222); // lighten
|
||||||
|
p.setColorFilter(filter);
|
||||||
|
canvas.drawBitmap(bm, new Matrix(), p);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyHighlightEffect(Bitmap src){
|
||||||
|
|
||||||
|
// create new bitmap, which will be painted and becomes result image
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(src.getWidth() + 96, src.getHeight() + 96, Bitmap.Config.ARGB_8888);
|
||||||
|
// setup canvas for painting
|
||||||
|
Canvas canvas = new Canvas(bmOut);
|
||||||
|
// setup default color
|
||||||
|
canvas.drawColor(0, PorterDuff.Mode.CLEAR);
|
||||||
|
|
||||||
|
// create a blur paint for capturing alpha
|
||||||
|
Paint ptBlur = new Paint();
|
||||||
|
ptBlur.setMaskFilter(new BlurMaskFilter(15, BlurMaskFilter.Blur.NORMAL));
|
||||||
|
int[] offsetXY = new int[2];
|
||||||
|
// capture alpha into a bitmap
|
||||||
|
Bitmap bmAlpha = src.extractAlpha(ptBlur, offsetXY);
|
||||||
|
// create a color paint
|
||||||
|
Paint ptAlphaColor = new Paint();
|
||||||
|
ptAlphaColor.setColor(0xFFFFFFFF);
|
||||||
|
// paint color for captured alpha region (bitmap)
|
||||||
|
canvas.drawBitmap(bmAlpha, offsetXY[0], offsetXY[1], ptAlphaColor);
|
||||||
|
// free memory
|
||||||
|
bmAlpha.recycle();
|
||||||
|
|
||||||
|
// paint the image source
|
||||||
|
canvas.drawBitmap(src, 0, 0, null);
|
||||||
|
|
||||||
|
// return out final image
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyInvertEffect(Bitmap src){
|
||||||
|
// create new bitmap with the same settings as source bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(src.getWidth(), src.getHeight(), src.getConfig());
|
||||||
|
// color info
|
||||||
|
int A, R, G, B;
|
||||||
|
int pixelColor;
|
||||||
|
// image size
|
||||||
|
int height = src.getHeight();
|
||||||
|
int width = src.getWidth();
|
||||||
|
|
||||||
|
// scan through every pixel
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
// get one pixel
|
||||||
|
pixelColor = src.getPixel(x, y);
|
||||||
|
// saving alpha channel
|
||||||
|
A = Color.alpha(pixelColor);
|
||||||
|
// inverting byte for each R/G/B channel
|
||||||
|
R = 255 - Color.red(pixelColor);
|
||||||
|
G = 255 - Color.green(pixelColor);
|
||||||
|
B = 255 - Color.blue(pixelColor);
|
||||||
|
// set newly-inverted pixel to output image
|
||||||
|
bmOut.setPixel(x, y, Color.argb(A, R, G, B));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return final bitmap
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyGreyscaleEffect(Bitmap src){
|
||||||
|
// constant factors
|
||||||
|
final double GS_RED = 0.299;
|
||||||
|
final double GS_GREEN = 0.587;
|
||||||
|
final double GS_BLUE = 0.114;
|
||||||
|
|
||||||
|
// create output bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(src.getWidth(), src.getHeight(), src.getConfig());
|
||||||
|
// pixel information
|
||||||
|
int A, R, G, B;
|
||||||
|
int pixel;
|
||||||
|
|
||||||
|
// get image size
|
||||||
|
int width = src.getWidth();
|
||||||
|
int height = src.getHeight();
|
||||||
|
|
||||||
|
// scan through every single pixel
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
// get one pixel color
|
||||||
|
pixel = src.getPixel(x, y);
|
||||||
|
// retrieve color of all channels
|
||||||
|
A = Color.alpha(pixel);
|
||||||
|
R = Color.red(pixel);
|
||||||
|
G = Color.green(pixel);
|
||||||
|
B = Color.blue(pixel);
|
||||||
|
// take conversion up to one single value
|
||||||
|
R = G = B = (int) (GS_RED * R + GS_GREEN * G + GS_BLUE * B);
|
||||||
|
// set new pixel color to output bitmap
|
||||||
|
bmOut.setPixel(x, y, Color.argb(A, R, G, B));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return final image
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Gamma Image (R, G, B) = (1.8, 1.8, 1.8)
|
||||||
|
public Bitmap applyGammaEffect(Bitmap src, double red, double green, double blue){
|
||||||
|
// create output image
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(src.getWidth(), src.getHeight(), src.getConfig());
|
||||||
|
// get image size
|
||||||
|
int width = src.getWidth();
|
||||||
|
int height = src.getHeight();
|
||||||
|
// color information
|
||||||
|
int A, R, G, B;
|
||||||
|
int pixel;
|
||||||
|
// constant value curve
|
||||||
|
final int MAX_SIZE = 256;
|
||||||
|
final double MAX_VALUE_DBL = 255.0;
|
||||||
|
final int MAX_VALUE_INT = 255;
|
||||||
|
final double REVERSE = 1.0;
|
||||||
|
|
||||||
|
// gamma arrays
|
||||||
|
int[] gammaR = new int[MAX_SIZE];
|
||||||
|
int[] gammaG = new int[MAX_SIZE];
|
||||||
|
int[] gammaB = new int[MAX_SIZE];
|
||||||
|
|
||||||
|
// setting values for every gamma channels
|
||||||
|
for (int i = 0; i < MAX_SIZE; ++i) {
|
||||||
|
gammaR[i] = (int) Math.min(MAX_VALUE_INT,
|
||||||
|
(int) ((MAX_VALUE_DBL * Math.pow(i / MAX_VALUE_DBL, REVERSE / red)) + 0.5));
|
||||||
|
gammaG[i] = (int) Math.min(MAX_VALUE_INT,
|
||||||
|
(int) ((MAX_VALUE_DBL * Math.pow(i / MAX_VALUE_DBL, REVERSE / green)) + 0.5));
|
||||||
|
gammaB[i] = (int) Math.min(MAX_VALUE_INT,
|
||||||
|
(int) ((MAX_VALUE_DBL * Math.pow(i / MAX_VALUE_DBL, REVERSE / blue)) + 0.5));
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply gamma table
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
// get pixel color
|
||||||
|
pixel = src.getPixel(x, y);
|
||||||
|
A = Color.alpha(pixel);
|
||||||
|
// look up gamma
|
||||||
|
R = gammaR[Color.red(pixel)];
|
||||||
|
G = gammaG[Color.green(pixel)];
|
||||||
|
B = gammaB[Color.blue(pixel)];
|
||||||
|
// set new color to output bitmap
|
||||||
|
bmOut.setPixel(x, y, Color.argb(A, R, G, B));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return final image
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyColorFilterEffect(Bitmap src, double red, double green, double blue){
|
||||||
|
// image size
|
||||||
|
int width = src.getWidth();
|
||||||
|
int height = src.getHeight();
|
||||||
|
// create output bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
|
||||||
|
// color information
|
||||||
|
int A, R, G, B;
|
||||||
|
int pixel;
|
||||||
|
|
||||||
|
// scan through all pixels
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
// get pixel color
|
||||||
|
pixel = src.getPixel(x, y);
|
||||||
|
// apply filtering on each channel R, G, B
|
||||||
|
A = Color.alpha(pixel);
|
||||||
|
R = (int) (Color.red(pixel) * red);
|
||||||
|
G = (int) (Color.green(pixel) * green);
|
||||||
|
B = (int) (Color.blue(pixel) * blue);
|
||||||
|
// set new color pixel to output bitmap
|
||||||
|
bmOut.setPixel(x, y, Color.argb(A, R, G, B));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return final image
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applySepiaToningEffect(Bitmap src, int depth, double red, double green, double blue){
|
||||||
|
// image size
|
||||||
|
int width = src.getWidth();
|
||||||
|
int height = src.getHeight();
|
||||||
|
// create output bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
|
||||||
|
// constant grayscale
|
||||||
|
final double GS_RED = 0.3;
|
||||||
|
final double GS_GREEN = 0.59;
|
||||||
|
final double GS_BLUE = 0.11;
|
||||||
|
// color information
|
||||||
|
int A, R, G, B;
|
||||||
|
int pixel;
|
||||||
|
|
||||||
|
// scan through all pixels
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
// get pixel color
|
||||||
|
pixel = src.getPixel(x, y);
|
||||||
|
// get color on each channel
|
||||||
|
A = Color.alpha(pixel);
|
||||||
|
R = Color.red(pixel);
|
||||||
|
G = Color.green(pixel);
|
||||||
|
B = Color.blue(pixel);
|
||||||
|
// apply grayscale sample
|
||||||
|
B = G = R = (int) (GS_RED * R + GS_GREEN * G + GS_BLUE * B);
|
||||||
|
|
||||||
|
// apply intensity level for sepid-toning on each channel
|
||||||
|
R += (depth * red);
|
||||||
|
if (R > 255) {
|
||||||
|
R = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
G += (depth * green);
|
||||||
|
if (G > 255) {
|
||||||
|
G = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
B += (depth * blue);
|
||||||
|
if (B > 255) {
|
||||||
|
B = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set new pixel color to output image
|
||||||
|
bmOut.setPixel(x, y, Color.argb(A, R, G, B));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return final image
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyDecreaseColorDepthEffect(Bitmap src, int bitOffset){
|
||||||
|
// get image size
|
||||||
|
int width = src.getWidth();
|
||||||
|
int height = src.getHeight();
|
||||||
|
// create output bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
|
||||||
|
// color information
|
||||||
|
int A, R, G, B;
|
||||||
|
int pixel;
|
||||||
|
|
||||||
|
// scan through all pixels
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
// get pixel color
|
||||||
|
pixel = src.getPixel(x, y);
|
||||||
|
A = Color.alpha(pixel);
|
||||||
|
R = Color.red(pixel);
|
||||||
|
G = Color.green(pixel);
|
||||||
|
B = Color.blue(pixel);
|
||||||
|
|
||||||
|
// round-off color offset
|
||||||
|
R = ((R + (bitOffset / 2)) - ((R + (bitOffset / 2)) % bitOffset) - 1);
|
||||||
|
if (R < 0) {
|
||||||
|
R = 0;
|
||||||
|
}
|
||||||
|
G = ((G + (bitOffset / 2)) - ((G + (bitOffset / 2)) % bitOffset) - 1);
|
||||||
|
if (G < 0) {
|
||||||
|
G = 0;
|
||||||
|
}
|
||||||
|
B = ((B + (bitOffset / 2)) - ((B + (bitOffset / 2)) % bitOffset) - 1);
|
||||||
|
if (B < 0) {
|
||||||
|
B = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set pixel color to output bitmap
|
||||||
|
bmOut.setPixel(x, y, Color.argb(A, R, G, B));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return final image
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyContrastEffect(Bitmap src, double value){
|
||||||
|
// image size
|
||||||
|
int width = src.getWidth();
|
||||||
|
int height = src.getHeight();
|
||||||
|
// create output bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
|
||||||
|
// color information
|
||||||
|
int A, R, G, B;
|
||||||
|
int pixel;
|
||||||
|
// get contrast value
|
||||||
|
double contrast = Math.pow((100 + value) / 100, 2);
|
||||||
|
|
||||||
|
// scan through all pixels
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
// get pixel color
|
||||||
|
pixel = src.getPixel(x, y);
|
||||||
|
A = Color.alpha(pixel);
|
||||||
|
// apply filter contrast for every channel R, G, B
|
||||||
|
R = Color.red(pixel);
|
||||||
|
R = (int) (((((R / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
|
||||||
|
if (R < 0) {
|
||||||
|
R = 0;
|
||||||
|
} else if (R > 255) {
|
||||||
|
R = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
G = Color.red(pixel);
|
||||||
|
G = (int) (((((G / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
|
||||||
|
if (G < 0) {
|
||||||
|
G = 0;
|
||||||
|
} else if (G > 255) {
|
||||||
|
G = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
B = Color.red(pixel);
|
||||||
|
B = (int) (((((B / 255.0) - 0.5) * contrast) + 0.5) * 255.0);
|
||||||
|
if (B < 0) {
|
||||||
|
B = 0;
|
||||||
|
} else if (B > 255) {
|
||||||
|
B = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set new pixel color to output bitmap
|
||||||
|
bmOut.setPixel(x, y, Color.argb(A, R, G, B));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return final image
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyBrightnessEffect(Bitmap src, int value){
|
||||||
|
// image size
|
||||||
|
int width = src.getWidth();
|
||||||
|
int height = src.getHeight();
|
||||||
|
// create output bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
|
||||||
|
// color information
|
||||||
|
int A, R, G, B;
|
||||||
|
int pixel;
|
||||||
|
|
||||||
|
// scan through all pixels
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
// get pixel color
|
||||||
|
pixel = src.getPixel(x, y);
|
||||||
|
A = Color.alpha(pixel);
|
||||||
|
R = Color.red(pixel);
|
||||||
|
G = Color.green(pixel);
|
||||||
|
B = Color.blue(pixel);
|
||||||
|
|
||||||
|
// increase/decrease each channel
|
||||||
|
R += value;
|
||||||
|
if (R > 255) {
|
||||||
|
R = 255;
|
||||||
|
} else if (R < 0) {
|
||||||
|
R = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
G += value;
|
||||||
|
if (G > 255) {
|
||||||
|
G = 255;
|
||||||
|
} else if (G < 0) {
|
||||||
|
G = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
B += value;
|
||||||
|
if (B > 255) {
|
||||||
|
B = 255;
|
||||||
|
} else if (B < 0) {
|
||||||
|
B = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply new pixel color to output bitmap
|
||||||
|
bmOut.setPixel(x, y, Color.argb(A, R, G, B));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return final image
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyGaussianBlurEffect(Bitmap src){
|
||||||
|
double[][] GaussianBlurConfig = new double[][] {
|
||||||
|
{1, 2, 1},
|
||||||
|
{2, 4, 2},
|
||||||
|
{1, 2, 1}
|
||||||
|
};
|
||||||
|
ConvolutionMatrix convMatrix = new ConvolutionMatrix(3);
|
||||||
|
convMatrix.applyConfig(GaussianBlurConfig);
|
||||||
|
convMatrix.Factor = 16;
|
||||||
|
convMatrix.Offset = 0;
|
||||||
|
return ConvolutionMatrix.computeConvolution3x3(src, convMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applySharpenEffect(Bitmap src, double weight){
|
||||||
|
double[][] SharpConfig = new double[][] {
|
||||||
|
{0, -2, 0},
|
||||||
|
{-2, weight, -2},
|
||||||
|
{0, -2, 0}
|
||||||
|
};
|
||||||
|
ConvolutionMatrix convMatrix = new ConvolutionMatrix(3);
|
||||||
|
convMatrix.applyConfig(SharpConfig);
|
||||||
|
convMatrix.Factor = weight - 8;
|
||||||
|
return ConvolutionMatrix.computeConvolution3x3(src, convMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyMeanRemovalEffect(Bitmap src){
|
||||||
|
double[][] MeanRemovalConfig = new double[][] {
|
||||||
|
{-1, -1, -1},
|
||||||
|
{-1, 9, -1},
|
||||||
|
{-1, -1, -1}
|
||||||
|
};
|
||||||
|
ConvolutionMatrix convMatrix = new ConvolutionMatrix(3);
|
||||||
|
convMatrix.applyConfig(MeanRemovalConfig);
|
||||||
|
convMatrix.Factor = 1;
|
||||||
|
convMatrix.Offset = 0;
|
||||||
|
return ConvolutionMatrix.computeConvolution3x3(src, convMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applySmoothEffect(Bitmap src, double value){
|
||||||
|
ConvolutionMatrix convMatrix = new ConvolutionMatrix(3);
|
||||||
|
convMatrix.setAll(1);
|
||||||
|
convMatrix.Matrix[1][1] = value;
|
||||||
|
convMatrix.Factor = value + 8;
|
||||||
|
convMatrix.Offset = 1;
|
||||||
|
return ConvolutionMatrix.computeConvolution3x3(src, convMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyEmbossEffect(Bitmap src){
|
||||||
|
double[][] EmbossConfig = new double[][] {
|
||||||
|
{-1, 0, -1},
|
||||||
|
{0, 4, 0},
|
||||||
|
{-1, 0, -1}
|
||||||
|
};
|
||||||
|
ConvolutionMatrix convMatrix = new ConvolutionMatrix(3);
|
||||||
|
convMatrix.applyConfig(EmbossConfig);
|
||||||
|
convMatrix.Factor = 1;
|
||||||
|
convMatrix.Offset = 127;
|
||||||
|
return ConvolutionMatrix.computeConvolution3x3(src, convMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyEngraveEffect(Bitmap src){
|
||||||
|
ConvolutionMatrix convMatrix = new ConvolutionMatrix(3);
|
||||||
|
convMatrix.setAll(0);
|
||||||
|
convMatrix.Matrix[0][0] = -2;
|
||||||
|
convMatrix.Matrix[1][1] = 2;
|
||||||
|
convMatrix.Factor = 1;
|
||||||
|
convMatrix.Offset = 95;
|
||||||
|
return ConvolutionMatrix.computeConvolution3x3(src, convMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyBoostEffect(Bitmap src, int type, float percent){
|
||||||
|
int width = src.getWidth();
|
||||||
|
int height = src.getHeight();
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
|
||||||
|
|
||||||
|
int A, R, G, B;
|
||||||
|
int pixel;
|
||||||
|
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
pixel = src.getPixel(x, y);
|
||||||
|
A = Color.alpha(pixel);
|
||||||
|
R = Color.red(pixel);
|
||||||
|
G = Color.green(pixel);
|
||||||
|
B = Color.blue(pixel);
|
||||||
|
if (type == 1) {
|
||||||
|
R = (int) (R * (1 + percent));
|
||||||
|
if (R > 255) R = 255;
|
||||||
|
} else if (type == 2) {
|
||||||
|
G = (int) (G * (1 + percent));
|
||||||
|
if (G > 255) G = 255;
|
||||||
|
} else if (type == 3) {
|
||||||
|
B = (int) (B * (1 + percent));
|
||||||
|
if (B > 255) B = 255;
|
||||||
|
}
|
||||||
|
bmOut.setPixel(x, y, Color.argb(A, R, G, B));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyRoundCornerEffect(Bitmap src, float round){
|
||||||
|
// image size
|
||||||
|
int width = src.getWidth();
|
||||||
|
int height = src.getHeight();
|
||||||
|
// create bitmap output
|
||||||
|
Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||||
|
// set canvas for painting
|
||||||
|
Canvas canvas = new Canvas(result);
|
||||||
|
canvas.drawARGB(0, 0, 0, 0);
|
||||||
|
|
||||||
|
// config paint
|
||||||
|
final Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setColor(Color.BLACK);
|
||||||
|
|
||||||
|
// config rectangle for embedding
|
||||||
|
final Rect rect = new Rect(0, 0, width, height);
|
||||||
|
final RectF rectF = new RectF(rect);
|
||||||
|
|
||||||
|
// draw rect to canvas
|
||||||
|
canvas.drawRoundRect(rectF, round, round, paint);
|
||||||
|
|
||||||
|
// create Xfer mode
|
||||||
|
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
|
||||||
|
// draw source image to canvas
|
||||||
|
canvas.drawBitmap(src, rect, rect, paint);
|
||||||
|
|
||||||
|
// return final image
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyTintEffect(Bitmap src, int degree){
|
||||||
|
|
||||||
|
int width = src.getWidth();
|
||||||
|
int height = src.getHeight();
|
||||||
|
|
||||||
|
int[] pix = new int[width * height];
|
||||||
|
src.getPixels(pix, 0, width, 0, 0, width, height);
|
||||||
|
|
||||||
|
int RY, GY, BY, RYY, GYY, BYY, R, G, B, Y;
|
||||||
|
double angle = (PI * (double) degree) / HALF_CIRCLE_DEGREE;
|
||||||
|
|
||||||
|
int S = (int) (RANGE * Math.sin(angle));
|
||||||
|
int C = (int) (RANGE * Math.cos(angle));
|
||||||
|
|
||||||
|
for (int y = 0; y < height; y++)
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
int index = y * width + x;
|
||||||
|
int r = (pix[index] >> 16) & 0xff;
|
||||||
|
int g = (pix[index] >> 8) & 0xff;
|
||||||
|
int b = pix[index] & 0xff;
|
||||||
|
RY = (70 * r - 59 * g - 11 * b) / 100;
|
||||||
|
GY = (-30 * r + 41 * g - 11 * b) / 100;
|
||||||
|
BY = (-30 * r - 59 * g + 89 * b) / 100;
|
||||||
|
Y = (30 * r + 59 * g + 11 * b) / 100;
|
||||||
|
RYY = (S * BY + C * RY) / 256;
|
||||||
|
BYY = (C * BY - S * RY) / 256;
|
||||||
|
GYY = (-51 * RYY - 19 * BYY) / 100;
|
||||||
|
R = Y + RYY;
|
||||||
|
R = (R < 0) ? 0 : (Math.min(R, 255));
|
||||||
|
G = Y + GYY;
|
||||||
|
G = (G < 0) ? 0 : (Math.min(G, 255));
|
||||||
|
B = Y + BYY;
|
||||||
|
B = (B < 0) ? 0 : (Math.min(B, 255));
|
||||||
|
pix[index] = 0xff000000 | (R << 16) | (G << 8) | B;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bitmap outBitmap = Bitmap.createBitmap(width, height, src.getConfig());
|
||||||
|
outBitmap.setPixels(pix, 0, width, 0, 0, width, height);
|
||||||
|
|
||||||
|
pix = null;
|
||||||
|
|
||||||
|
return outBitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyFleaEffect(Bitmap source){
|
||||||
|
// get image size
|
||||||
|
int width = source.getWidth();
|
||||||
|
int height = source.getHeight();
|
||||||
|
int[] pixels = new int[width * height];
|
||||||
|
// get pixel array from source
|
||||||
|
source.getPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
// a random object
|
||||||
|
Random random = new Random();
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
// iteration through pixels
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
// get current index in 2D-matrix
|
||||||
|
index = y * width + x;
|
||||||
|
// get random color
|
||||||
|
int randColor = Color.rgb(random.nextInt(COLOR_MAX),
|
||||||
|
random.nextInt(COLOR_MAX), random.nextInt(COLOR_MAX));
|
||||||
|
// OR
|
||||||
|
pixels[index] |= randColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// output bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(width, height, source.getConfig());
|
||||||
|
bmOut.setPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyBlackFilter(Bitmap source){
|
||||||
|
// get image size
|
||||||
|
int width = source.getWidth();
|
||||||
|
int height = source.getHeight();
|
||||||
|
int[] pixels = new int[width * height];
|
||||||
|
// get pixel array from source
|
||||||
|
source.getPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
// random object
|
||||||
|
Random random = new Random();
|
||||||
|
|
||||||
|
int R, G, B, index = 0, thresHold = 0;
|
||||||
|
// iteration through pixels
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
// get current index in 2D-matrix
|
||||||
|
index = y * width + x;
|
||||||
|
// get color
|
||||||
|
R = Color.red(pixels[index]);
|
||||||
|
G = Color.green(pixels[index]);
|
||||||
|
B = Color.blue(pixels[index]);
|
||||||
|
// generate threshold
|
||||||
|
thresHold = random.nextInt(COLOR_MAX);
|
||||||
|
if (R < thresHold && G < thresHold && B < thresHold) {
|
||||||
|
pixels[index] = Color.rgb(COLOR_MIN, COLOR_MIN, COLOR_MIN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// output bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||||
|
bmOut.setPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applySnowEffect(Bitmap source){
|
||||||
|
// get image size
|
||||||
|
int width = source.getWidth();
|
||||||
|
int height = source.getHeight();
|
||||||
|
int[] pixels = new int[width * height];
|
||||||
|
// get pixel array from source
|
||||||
|
source.getPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
// random object
|
||||||
|
Random random = new Random();
|
||||||
|
|
||||||
|
int R, G, B, index = 0, thresHold = 50;
|
||||||
|
// iteration through pixels
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
// get current index in 2D-matrix
|
||||||
|
index = y * width + x;
|
||||||
|
// get color
|
||||||
|
R = Color.red(pixels[index]);
|
||||||
|
G = Color.green(pixels[index]);
|
||||||
|
B = Color.blue(pixels[index]);
|
||||||
|
// generate threshold
|
||||||
|
thresHold = random.nextInt(COLOR_MAX);
|
||||||
|
if (R > thresHold && G > thresHold && B > thresHold) {
|
||||||
|
pixels[index] = Color.rgb(COLOR_MAX, COLOR_MAX, COLOR_MAX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// output bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
|
||||||
|
bmOut.setPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyShadingFilter(Bitmap source, int shadingColor){
|
||||||
|
// get image size
|
||||||
|
int width = source.getWidth();
|
||||||
|
int height = source.getHeight();
|
||||||
|
int[] pixels = new int[width * height];
|
||||||
|
// get pixel array from source
|
||||||
|
source.getPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
// iteration through pixels
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
// get current index in 2D-matrix
|
||||||
|
index = y * width + x;
|
||||||
|
// AND
|
||||||
|
pixels[index] &= shadingColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// output bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||||
|
bmOut.setPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applySaturationFilter(Bitmap source, int level){
|
||||||
|
// get image size
|
||||||
|
int width = source.getWidth();
|
||||||
|
int height = source.getHeight();
|
||||||
|
int[] pixels = new int[width * height];
|
||||||
|
float[] HSV = new float[3];
|
||||||
|
// get pixel array from source
|
||||||
|
source.getPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
// iteration through pixels
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
// get current index in 2D-matrix
|
||||||
|
index = y * width + x;
|
||||||
|
// convert to HSV
|
||||||
|
Color.colorToHSV(pixels[index], HSV);
|
||||||
|
// increase Saturation level
|
||||||
|
HSV[1] *= level;
|
||||||
|
HSV[1] = (float) Math.max(0.0, Math.min(HSV[1], 1.0));
|
||||||
|
// take color back
|
||||||
|
pixels[index] |= Color.HSVToColor(HSV);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// output bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||||
|
bmOut.setPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyHueFilter(Bitmap source, int level){
|
||||||
|
// get image size
|
||||||
|
int width = source.getWidth();
|
||||||
|
int height = source.getHeight();
|
||||||
|
int[] pixels = new int[width * height];
|
||||||
|
float[] HSV = new float[3];
|
||||||
|
// get pixel array from source
|
||||||
|
source.getPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
// iteration through pixels
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
// get current index in 2D-matrix
|
||||||
|
index = y * width + x;
|
||||||
|
// convert to HSV
|
||||||
|
Color.colorToHSV(pixels[index], HSV);
|
||||||
|
// increase Saturation level
|
||||||
|
HSV[0] *= level;
|
||||||
|
HSV[0] = (float) Math.max(0.0, Math.min(HSV[0], 360.0));
|
||||||
|
// take color back
|
||||||
|
pixels[index] |= Color.HSVToColor(HSV);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// output bitmap
|
||||||
|
Bitmap bmOut = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||||
|
bmOut.setPixels(pixels, 0, width, 0, 0, width, height);
|
||||||
|
return bmOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap applyReflection(Bitmap originalImage){
|
||||||
|
// gap space between original and reflected
|
||||||
|
final int reflectionGap = 4;
|
||||||
|
// get image size
|
||||||
|
int width = originalImage.getWidth();
|
||||||
|
int height = originalImage.getHeight();
|
||||||
|
|
||||||
|
// this will not scale but will flip on the Y axis
|
||||||
|
Matrix matrix = new Matrix();
|
||||||
|
matrix.preScale(1, -1);
|
||||||
|
|
||||||
|
// create a Bitmap with the flip matrix applied to it.
|
||||||
|
// we only want the bottom half of the image
|
||||||
|
Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, height / 2, width, height / 2, matrix, false);
|
||||||
|
|
||||||
|
// create a new bitmap with same width but taller to fit reflection
|
||||||
|
Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height / 2), Bitmap.Config.ARGB_8888);
|
||||||
|
|
||||||
|
// create a new Canvas with the bitmap that's big enough for
|
||||||
|
// the image plus gap plus reflection
|
||||||
|
Canvas canvas = new Canvas(bitmapWithReflection);
|
||||||
|
// draw in the original image
|
||||||
|
canvas.drawBitmap(originalImage, 0, 0, null);
|
||||||
|
// draw in the gap
|
||||||
|
Paint defaultPaint = new Paint();
|
||||||
|
canvas.drawRect(0, height, width, height + reflectionGap, defaultPaint);
|
||||||
|
// draw in the reflection
|
||||||
|
canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
|
||||||
|
|
||||||
|
// create a shader that is a linear gradient that covers the reflection
|
||||||
|
Paint paint = new Paint();
|
||||||
|
LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0,
|
||||||
|
bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff,
|
||||||
|
Shader.TileMode.CLAMP);
|
||||||
|
// set the paint to use this shader (linear gradient)
|
||||||
|
paint.setShader(shader);
|
||||||
|
// set the Transfer mode to be porter duff and destination in
|
||||||
|
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
|
||||||
|
// draw a rectangle using the paint with our linear gradient
|
||||||
|
canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);
|
||||||
|
|
||||||
|
return bitmapWithReflection;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,8 +8,6 @@ import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.requestUpdateWallpa
|
|||||||
import static ru.vtosters.lite.utils.CacheUtils.deleteCache;
|
import static ru.vtosters.lite.utils.CacheUtils.deleteCache;
|
||||||
import static ru.vtosters.lite.utils.Globals.edit;
|
import static ru.vtosters.lite.utils.Globals.edit;
|
||||||
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||||
import static ru.vtosters.lite.utils.Globals.getPreferences;
|
|
||||||
import static ru.vtosters.lite.utils.Preferences.DoNotUseOldIcons;
|
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -29,7 +27,6 @@ import java.io.InputStream;
|
|||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import ru.vtosters.lite.ui.PreferencesUtil;
|
import ru.vtosters.lite.ui.PreferencesUtil;
|
||||||
import ru.vtosters.lite.utils.Globals;
|
|
||||||
|
|
||||||
public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment{
|
public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment{
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +1,16 @@
|
|||||||
package ru.vtosters.lite.ui.wallpapers;
|
package ru.vtosters.lite.ui.wallpapers;
|
||||||
import static com.vk.im.engine.h.im_bg_chat;
|
import static com.vk.im.engine.h.im_bg_chat;
|
||||||
|
import static ru.vtosters.lite.ui.wallpapers.ImageFilters.getBlurredWallpaper;
|
||||||
|
import static ru.vtosters.lite.ui.wallpapers.ImageFilters.getDimmed;
|
||||||
|
import static ru.vtosters.lite.ui.wallpapers.ImageFilters.getMonochrome;
|
||||||
|
import static ru.vtosters.lite.ui.wallpapers.ImageFilters.getMosaic;
|
||||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||||
import static ru.vtosters.lite.utils.Globals.getPreferences;
|
import static ru.vtosters.lite.utils.Globals.getPreferences;
|
||||||
import static ru.vtosters.lite.utils.Globals.getResources;
|
|
||||||
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.Canvas;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.graphics.ColorFilter;
|
|
||||||
import android.graphics.LightingColorFilter;
|
|
||||||
import android.graphics.Matrix;
|
|
||||||
import android.graphics.Paint;
|
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
import com.vk.medianative.MediaNative;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
public class WallpapersHooks{
|
public class WallpapersHooks{
|
||||||
@@ -127,96 +120,6 @@ public class WallpapersHooks{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Drawable getBlurredWallpaper(Drawable orig, int radius){
|
|
||||||
try {
|
|
||||||
if (orig == null) return null;
|
|
||||||
if (!(orig instanceof BitmapDrawable)) return orig; // we need only BitmapDrawable
|
|
||||||
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
|
|
||||||
MediaNative.blurBitmap(instance, radius);
|
|
||||||
return new BitmapDrawable(getResources(), instance);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return orig;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Drawable getMosaic(Drawable orig){
|
|
||||||
int scale = 100;
|
|
||||||
|
|
||||||
if (orig == null) return null;
|
|
||||||
if (!(orig instanceof BitmapDrawable)) return orig;
|
|
||||||
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
|
|
||||||
String radius = getPreferences().getString("msg_mosaic", "disabled");
|
|
||||||
|
|
||||||
switch(radius) {
|
|
||||||
case "high":
|
|
||||||
scale = 25;
|
|
||||||
break;
|
|
||||||
case "med":
|
|
||||||
scale = 50;
|
|
||||||
break;
|
|
||||||
case "low":
|
|
||||||
scale = 75;
|
|
||||||
}
|
|
||||||
|
|
||||||
Bitmap temp = Bitmap.createScaledBitmap(instance, scale, scale, false);
|
|
||||||
Bitmap mosaicBitmap = Bitmap.createScaledBitmap(temp, instance.getWidth(), instance.getHeight(), false);
|
|
||||||
|
|
||||||
return new BitmapDrawable(getResources(), mosaicBitmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Drawable getDimmed(Drawable orig){
|
|
||||||
if (orig == null) return null;
|
|
||||||
if (!(orig instanceof BitmapDrawable)) return orig;
|
|
||||||
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
|
|
||||||
String radius = getPreferences().getString("msg_dim", "disabled");
|
|
||||||
switch(radius) {
|
|
||||||
case "dim_black":
|
|
||||||
instance = darken(instance);
|
|
||||||
case "dim_white":
|
|
||||||
instance = lighten(instance);
|
|
||||||
}
|
|
||||||
return new BitmapDrawable(getResources(), instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Drawable getMonochrome(Drawable orig){
|
|
||||||
if (orig == null) return null;
|
|
||||||
if (!(orig instanceof BitmapDrawable)) return orig;
|
|
||||||
Bitmap instance = ((BitmapDrawable) orig).getBitmap().copy(Bitmap.Config.ARGB_8888, true);
|
|
||||||
|
|
||||||
Bitmap bwBitmap = Bitmap.createBitmap( instance.getWidth(), instance.getHeight(), Bitmap.Config.RGB_565 );
|
|
||||||
float[] hsv = new float[ 3 ];
|
|
||||||
for( int col = 0; col < instance.getWidth(); col++ ) {
|
|
||||||
for( int row = 0; row < instance.getHeight(); row++ ) {
|
|
||||||
Color.colorToHSV( instance.getPixel( col, row ), hsv );
|
|
||||||
if( hsv[ 2 ] > 0.5f ) {
|
|
||||||
bwBitmap.setPixel( col, row, 0xffffffff );
|
|
||||||
} else {
|
|
||||||
bwBitmap.setPixel( col, row, 0xff000000 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new BitmapDrawable(getResources(), bwBitmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Bitmap darken(Bitmap bm){
|
|
||||||
Canvas canvas = new Canvas(bm);
|
|
||||||
Paint p = new Paint(Color.RED);
|
|
||||||
ColorFilter filter = new LightingColorFilter(0xFF7F7F7F, 0x00000000); // darken
|
|
||||||
p.setColorFilter(filter);
|
|
||||||
canvas.drawBitmap(bm, new Matrix(), p);
|
|
||||||
return bm;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Bitmap lighten(Bitmap bm){
|
|
||||||
Canvas canvas = new Canvas(bm);
|
|
||||||
Paint p = new Paint(Color.RED);
|
|
||||||
ColorFilter filter = new LightingColorFilter(0xFFFFFFFF, 0x00222222); // lighten
|
|
||||||
p.setColorFilter(filter);
|
|
||||||
canvas.drawBitmap(bm, new Matrix(), p);
|
|
||||||
return bm;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void removeWallpaper(){
|
public static void removeWallpaper(){
|
||||||
getWallpaperFile().delete();
|
getWallpaperFile().delete();
|
||||||
|
|||||||
Reference in New Issue
Block a user