首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Android 圖片虛化實現:RenderScript 高效模糊與 Java 原生 Stack Blur 算法對比

     編輯:Java 相關知識

方案一:RenderScript(API 17+,高性能)

private void blur(Bitmap bkg, View view, float radius) {
    Bitmap overlay = Bitmap.createBitmap(view.getMeasuredWidth(),
            view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(overlay);
    canvas.drawBitmap(bkg, -view.getLeft(), -view.getTop(), null);
    RenderScript rs = RenderScript.create(this);
    Allocation overlayAlloc = Allocation.createFromBitmap(rs, overlay);
    ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, overlayAlloc.getElement());
    blur.setInput(overlayAlloc);
    blur.setRadius(radius); // 0 < radius <= 25
    blur.forEach(overlayAlloc);
    overlayAlloc.copyTo(overlay);
    view.setBackground(new BitmapDrawable(getResources(), overlay));
    rs.destroy();
}

優點:GPU 加速、極快、代碼簡潔。
缺點:需 API 17+(Android 4.2+),舊設備不支持。

方案二:Java 原生 Stack Blur 算法(全版本兼容,較慢)

基於 Mario Klingemann 的 Stack Blur 算法,介於高斯模糊與盒模糊之間,速度比高斯模糊快 7 倍。

public Bitmap fastblur(Bitmap sentBitmap, int radius) {
    if (radius < 1) return null;
    Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
    int w = bitmap.getWidth(), h = bitmap.getHeight();
    int[] pix = new int[w * h];
    bitmap.getPixels(pix, 0, w, 0, 0, w, h);
    // 核心模糊邏輯(約 200 行),包含水平垂直兩次掃描
    // 使用移動棧維護顏色窗口,O(1) 更新均值
    // 詳細代碼見原文,此處省略核心循環
    bitmap.setPixels(pix, 0, w, 0, 0, w, h);
    return bitmap;
}

優點:無版本限制、純 Java 實現。
缺點:CPU 計算耗時,大圖建議縮放後處理或放入後台線程。

性能對比建議

指標RenderScriptStack Blur
1080p 圖片 radius=15~15ms~300ms
最低 API171
內存佔用額外 Allocation像素數組

最佳實踐

  • 運行時檢測 Build.VERSION.SDK_INT >= 17 動態選擇方案
  • 大圖先縮小(如 1/4)模糊再放大,大幅提升速度
  • 模糊操作放入 RxJava/Coroutine 後台線程,避免阻塞 UI
  • 缓存模糊結果,避免重複計算
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved