android背景虛化
❶ android 背景虛化原理是什麼
1. RenderScript
談到高斯模糊,第一個想到的就是RenderScript。RenderScript是由Android3.0引入,用來在Android上編寫高性能代碼的一種語言(使用C99標准)。 引用官方文檔的描述:
RenderScript runtime will parallelize work across all processors available on a device, such as multi-core CPUs, GPUs, or DSPs, allowing you to focus on expressing algorithms rather than scheling work or load balancing.
為了在Android中使用RenderScript,我們需要(直接貼官方文檔,比直譯更通俗易懂):
High-performance compute kernels are written in a C99-derived language.
A java API is used for managing the lifetime of RenderScript resources and controlling kernel execution.
學習文檔:http://developer.android.com/guide/topics/renderscript/compute.html
上面兩點總結成一句話為:我們需要一組compute kernels(.rs文件中編寫),及一組用於控制renderScript相關的java api(.rs文件自動生成為java類)。 由於compute kernels的編寫需要一定的學習成本,從JELLY_BEAN_MR1開始,Androied內置了一些compute kernels用於常用的操作,其中就包括了Gaussian blur。
下面,通過實操來講解一下RenderScript來實現高斯模糊,最終實現效果(講文字背景進行模糊處理):
布局:
[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/picture"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/splash"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/text"
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Gaussian Blur"
android:textColor="@android:color/black"
android:layout_gravity="center_vertical"
android:textStyle="bold"
android:textSize="48sp" />
<LinearLayout
android:id="@+id/controls"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#7f000000"
android:orientation="vertical"
android:layout_gravity="bottom" />
</FrameLayout>
核心代碼:
[java] view plain
private void applyBlur() {
image.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
image.getViewTreeObserver().removeOnPreDrawListener(this);
image.buildDrawingCache();
Bitmap bmp = image.getDrawingCache();
blur(bmp, text, true);
return true;
}
});
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private void blur(Bitmap bkg, View view) {
long startMs = System.currentTimeMillis();
float radius = 20;
Bitmap overlay = Bitmap.createBitmap((int)(view.getMeasuredWidth()), (int)(view.getMeasuredHeight()), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(overlay);
canvas.translate(-view.getLeft(), -view.getTop());
canvas.drawBitmap(bkg, 0, 0, null);
RenderScript rs = RenderScript.create(SecondActivity.this);
Allocation overlayAlloc = Allocation.createFromBitmap(rs, overlay);
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, overlayAlloc.getElement());
blur.setInput(overlayAlloc);
blur.setRadius(radius);
blur.forEach(overlayAlloc);
overlayAlloc.To(overlay);
view.setBackground(new BitmapDrawable(getResources(), overlay));
rs.destroy();
statusText.setText("cost " + (System.currentTimeMillis() - startMs) + "ms");
}
當ImageView開始載入背景圖時,取出它的drawableCache,進行blur處理,Gaussian blur的主要邏輯在blur函數中。對於在Java中使用RenderScript,文檔中也有詳細描述,對應到我們的代碼,步驟為:
初始化一個RenderScript Context.
至少創建一個Allocation對象用於存儲需要處理的數據.
創建compute kernel的實例,本例中是內置的ScriptIntrinsicBlur對象.
設置ScriptIntrinsicBlur實例的相關屬性,包括Allocation, radius等.
開始blur操作,對應(forEach).
將blur後的結果拷貝回bitmap中。
❷ 蘋果手機跟安卓手機視頻模糊背景能顯示不
能
蘋果13微信視頻背景虛化方法如下:
1.要在視頻通話中模糊背景,請先使用任何應用撥打電話。 讓我們把 WhatsApp 這里; 打開 WhatsApp 應用程序並進行視頻通話。在使用微信視頻通話時,下拉出蘋果13手機的控制中心,點擊視頻效果。
2.點擊人像模式圖標,等圖標從藍色變成灰色即可關閉背景虛化。
❸ 如何實現Android 布局背景模糊化處理
在模仿 IOS 密碼輸入頁面的時候發現其背景有模糊處理,於是了解了一下並記錄下來,以便使用.在Android 中具體實現方法如下
查考 http://www.cnblogs.com/lipeil/p/3997992.html
Java代碼
private void applyBlur() {
// 獲取壁紙管理器
WallpaperManager wallpaperManager = WallpaperManager.getInstance(this.getContext());
// 獲取當前壁紙
Drawable wallpaperDrawable = wallpaperManager.getDrawable();
// 將Drawable,轉成Bitmap
Bitmap bmp = ((BitmapDrawable) wallpaperDrawable).getBitmap();
blur(bmp);
}
下面之所以要進行small 和big的處理,是因為僅僅靠ScriptIntrinsicBlur
來處理模式,不能到達更模式的效果,如果需要加深模式效果就需要先把背景圖片縮小,在處理完之後再放大.這個可以使用Matrix
來實現,而且這樣可以縮短模糊化得時間
Java代碼
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private void blur(Bitmap bkg) {
long startMs = System.currentTimeMillis();
float radius = 20;
bkg = small(bkg);
Bitmap bitmap = bkg.(bkg.getConfig(), true);
final RenderScript rs = RenderScript.create(this.getContext());
final Allocation input = Allocation.createFromBitmap(rs, bkg, Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
final Allocation output = Allocation.createTyped(rs, input.getType());
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setRadius(radius);
script.setInput(input);
script.forEach(output);
output.To(bitmap);
bitmap = big(bitmap);
setBackground(new BitmapDrawable(getResources(), bitmap));
rs.destroy();
Log.d("zhangle","blur take away:" + (System.currentTimeMillis() - startMs )+ "ms");
}
private static Bitmap big(Bitmap bitmap) {
Matrix matrix = new Matrix();
matrix.postScale(4f,4f); //長和寬放大縮小的比例
Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
return resizeBmp;
}
private static Bitmap small(Bitmap bitmap) {
Matrix matrix = new Matrix();
matrix.postScale(0.25f,0.25f); //長和寬放大縮小的比例
Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
return resizeBmp;
}
❹ 華為手機拍照取消虛化
華為P30 Pro相機怎麼關閉虛化,我們在用現在的華為手機拍照的時候,效果非常好,不僅有虛化效果,而且還有其他的功能,看上去非常高端,但是有的時候,因為工作需要,拍攝的時候並不需要虛化,那麼具體如何關閉呢?小白就告訴大家華為P30 Pro相機怎麼關閉虛化
工具/原料
more
操作手機:華為P30 Pro 操作系統:安卓Android 10 手機系統:EMUI10.0.0
方法/步驟
1/6 分步閱讀
我們打開手機桌面,然後點擊桌面上的照相機選項。
2/6
進入照相機之後,在最上方有一個ai圖標,我們點擊一下。
華為拍照手機-京東手機,世界在手,精彩掌控
廣告
3/6
點擊一下,進行關閉,這樣我們的智能拍照功能就取消了。
合肥 10核256G內存現在手機像素最高多少,899元全網首發超長待機
廣告
4/6
然後在我們拍照的時候,點擊一下其中的人像。
「合肥·客戶服務」-維修地址查詢_維修地區分布查詢
廣告
5/6
然後點擊一下配置。這裡面有我們的各種特效。
6/6
將所有的效果取消,點擊一下最前方的無,這樣我們綜合起來進行拍照,就不會有背景虛化的效果了。
方法/步驟
1/6 分步閱讀
打開手機相機,點擊進入拍照。
2/6
拍攝的時候不要離拍攝物太近,保持一定的距離。
3/6
或者調解焦距設置一個合適的焦距。
4/6
如果是大光圈模式,可以設置成拍照模式。
5/6
選擇底部的拍照選項,進入拍照模式來拍攝。
6/6
如果還是自動虛化點擊關閉上面的AI功能。
總結
1/1
1.打開相機。
2.關閉ai效果。
3.在人像調節處設置效果為無。
注意事項
Tips:在外拍攝的時候,虛化還是非常好用的。
編輯
❺ 安卓手機上有個水滴標啥意思
背景虛化。
手機右上角水滴圖標是背景虛化的意思,OPPOR9s加入了自拍虛化後,讓人的主體位置更加的突出。
❻ 怎麼實現Android 布局背景模糊化處理
這里的模糊都是給設置的背景半透明,就是android:background設置為半透明的在color.xml中定義半透明的方式是這樣,#AARRGGBB,#後邊的AA就是透明度,從00不透明到FF純透明,後面的RRGGBB是從000000到FFFFFF的從黑色到白色
❼ 怎麼實現Android 布局背景模糊化處理
在模仿 IOS 密碼輸入頁面的時候發現其背景有模糊處理,於是了解了一下並記錄下來,以便使用.在Android 中具體實現方法如下
private void applyBlur() {
// 獲取壁紙管理器
WallpaperManager wallpaperManager = WallpaperManager.getInstance(this.getContext());
// 獲取當前壁紙
Drawable wallpaperDrawable = wallpaperManager.getDrawable();
// 將Drawable,轉成Bitmap
Bitmap bmp = ((BitmapDrawable) wallpaperDrawable).getBitmap();
blur(bmp);
}
下面之所以要進行small 和big的處理,是因為僅僅靠ScriptIntrinsicBlur 來處理模式,不能到達更模式的效果,如果需要加深模式效果就需要先把背景圖片縮小,在處理完之後再放大.這個可以使用Matrix 來實現,而且這樣可以縮短模糊化得時間
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private void blur(Bitmap bkg) {
long startMs = System.currentTimeMillis();
float radius = 20;
bkg = small(bkg);
Bitmap bitmap = bkg.(bkg.getConfig(), true);
final RenderScript rs = RenderScript.create(this.getContext());
final Allocation input = Allocation.createFromBitmap(rs, bkg, Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
final Allocation output = Allocation.createTyped(rs, input.getType());
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setRadius(radius);
script.setInput(input);
script.forEach(output);
output.To(bitmap);
bitmap = big(bitmap);
setBackground(new BitmapDrawable(getResources(), bitmap));
rs.destroy();
Log.d("zhangle","blur take away:" + (System.currentTimeMillis() - startMs )+ "ms");
}
private static Bitmap big(Bitmap bitmap) {
Matrix matrix = new Matrix();
matrix.postScale(4f,4f); //長和寬放大縮小的比例
Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
return resizeBmp;
}
private static Bitmap small(Bitmap bitmap) {
Matrix matrix = new Matrix();
matrix.postScale(0.25f,0.25f); //長和寬放大縮小的比例
Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
return resizeBmp;
}