1. 程式人生 > >android獲取圖片亮度

android獲取圖片亮度

原理:bitmap.getPixel返回的是ARGB值,通過移位操作獲取到R、G、B的值,
    使用亮度=0.229×R + 0.587*G + 0.114*B進行亮度值計算,
    將所有點的亮度值相加後取一個平均值,
    如果這個值比128大,則這個圖片較亮,如果這個值比128小,則這個圖比較暗。




//java

private int getBright(Bitmap bm) {
    Log.d(TAG, "getBright start");
    if(bm == null) return -1;
    int width = bm.getWidth();
    int height = bm.getHeight();
    int r, g, b;
    int count = 0;
    int bright = 0;
    count = width * height;
    int[] buffer = new int[width * height];

    bm.getPixels(buffer, 0, width, 0, 0, width , height);
    Log.d(TAG, "width:" + width + ",height:" + height);
    for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
            int localTemp = buffer[j * width + i];//bm.getPixel(i, j);
            r = (localTemp >> 16) & 0xff;
            g = (localTemp >> 8) & 0xff;
            b = localTemp & 0xff;
            bright = (int) (bright + 0.299 * r + 0.587 * g + 0.114 * b);
        }
    }
    Log.d(TAG, "getBright end");
    return bright / count;
}


//c++
    //定義
    public int getBitmapBright(Bitmap bitmap) {
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        int[] buffer = new int[w * h];
        bitmap.getPixels(buffer, 0, w, 0, 0, w, h);
        return getBitmapBrightByArr(buffer, w, h);
    }


    public native int getBitmapBrightByArr(int[] buffer, int width, int height);


  //實現
extern "C" JNIEXPORT jint JNICALL
Java_com_zpy_wallpaperhsb_ImageNativeTool_getBitmapBrightByArr(
        JNIEnv *env,
        jobject /* this */, jintArray buffer, jint jwidth, jint jheight) {

    jint* source = env->GetIntArrayElements(buffer, 0);
    int width = jwidth;
    int height = jheight;
    int r, g, b;
    int count = 0;
    int bright = 0;
    count = width * height;
    for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
            int localTemp = source[j * width + i];
            r = (localTemp >> 16) & 0xff;
            g = (localTemp >> 8) & 0xff;
            b = localTemp & 0xff;
            bright = (int) (bright + 0.299 * r + 0.587 * g + 0.114 * b);
        }
    }
    return bright / count;

}


計算亮度對圖片要求不高,可以先縮小圖片後計算,對亮度計算幾乎無影響。
//縮放
    public static Bitmap scaleMatrix(Bitmap bitmap, float scaleX, float scaleY){
        Log.d(TAG, "scaleMatrix start");
        try {
            int w = bitmap.getWidth();
            int h = bitmap.getHeight();
            float scaleW = scaleX;
            float scaleH = scaleY;
            Matrix matrix = new Matrix();
            matrix.postScale(scaleW, scaleH); // 長和寬放大縮小的比例
            Bitmap scaleBitmap =  Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, false);
            Log.d(TAG, "scaleMatrix normal end");
            return scaleBitmap;

        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.d(TAG, "scaleMatrix error end");
        return bitmap;

    }