检测背景壁纸是否太亮或太暗

Detect if background wallpaper is too light or too dark

我想在用户选择的墙纸太亮或太暗时更改我的 textviews 颜色基本上作为最新的启动器,例如,如果它设置为白色墙纸,将所有 textviews 更改为深色颜色,但我不知道如何检测。

求助。提前致谢。

我建议您取每个像素的 r、g 和 b 值的平均值(创建单色图片),然后对所有像素取平均值以获得一个全局平均值。该平均值将在 0 到 255 之间(如果图像是 8 位深)。然后,选择一个阈值,高于该阈值的图像将被视为 light/dark。

这会计算位图图像的(估计)亮度。 参数 "skipPixel" 定义了亮度计算要跳过多少像素,因为计算每个像素的亮度可能会占用大量运行时间。较高的值会导致更好的性能,但会产生更多的估计结果值。 当 skipPixel 等于 1 时,该方法实际计算的是实际平均亮度,而不是估计值。 所以 "skipPixel" 需要为 1 或更大! 函数 returns 亮度级别介于 0 和 255 之间,其中 0 = 全黑,255 = 全亮。 所以你必须自己选择,"bright" 或 "dark" 对你意味着什么。

public int calculateBrightness(android.graphics.Bitmap bitmap, int skipPixel) {
    int R = 0; int G = 0; int B = 0;
    int height = bitmap.getHeight();
    int width = bitmap.getWidth();
    int n = 0;
    int[] pixels = new int[width * height];
    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
    for (int i = 0; i < pixels.length; i += skipPixel) {
        int color = pixels[i];
        R += Color.red(color);
        G += Color.green(color);
        B += Color.blue(color);
        n++;
    }
    return (R + B + G) / (n * 3);
}

要从您的设备获取位图(图像),您可以使用此代码:

final String photoPath = "path to your photo"; // Add photo path here
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(photoPath, options);