通过bitmap获取灰度值,来判断是否是浅色的图片,进而可以进行一些类似反色的逻辑。
private static final float SCALE_RATIO_FACTOR = 100.0f;
public static boolean isWallpaperBright(Bitmap wallpaper) {
Bitmap scaledBitmap = scaleBitmapDown(wallpaper);
boolean result =
isBitmapBright(scaledBitmap, scaledBitmap.getWidth(), scaledBitmap.getHeight());
if (scaledBitmap != wallpaper) {
scaledBitmap.recycle();
}
return result;
}
private static boolean isBitmapBright(Bitmap bitmap, int width, int height) {
float hitCount = 0;
width = Math.min(width, bitmap.getWidth());
height = Math.min(height, bitmap.getHeight());
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int color = bitmap.getPixel(i, j);
// Calculate gray value (RGB -> YUV)
if (isBright(color)) {
hitCount++;
}
}
}
return (hitCount / (width * height)) > 0.5;
}
private static boolean isBright(int color) {
double grayLevel = (Color.red(color) * 30 + Color.green(color) * 59
+ Color.blue(color) * 11 ) / 100;
return grayLevel >= 215;
}
private static Bitmap scaleBitmapDown(Bitmap bitmap) {
int minDimension = Math.min(bitmap.getWidth(), bitmap.getHeight());
if (minDimension <= SCALE_RATIO_FACTOR) {
return bitmap;
} else {
float scaleRatio = SCALE_RATIO_FACTOR / (float) minDimension;
return Bitmap.createScaledBitmap(bitmap,
Math.round((float)bitmap.getWidth() * scaleRatio),
Math.round((float)bitmap.getHeight() * scaleRatio), false);
}
}