Android 攝像頭高斯模糊的示例代碼
好久沒寫文章了,之前項目中有過這個需求但是時間緊就在上面蓋了個半透明的白色圖片,效果.....
好了,不廢話,先看一下效果吧

注意了,這不是對單純的圖片進行高斯模糊,而是對攝像頭實時處理
原理:
大體講一下實現(xiàn)原理,攝像頭回調(diào)的每一幀通過RenderScript將字節(jié)數(shù)組轉(zhuǎn)換為Bitmap,再對Bitmap進行高斯模糊處理。流暢度還是不錯的。畢竟RenderScript使用的是GPU去計算,速度比普通的用CPU計算的方法快的多
核心代碼:
/**
* 轉(zhuǎn)換數(shù)據(jù)并進行模糊處理
*/
public Bitmap blur(byte[] data, Camera camera,float blurvaule){
Camera.Size previewSize = camera.getParameters().getPreviewSize();
if (yuvType == null)
{
yuvType = new Type.Builder(rs, Element.U8(rs)).setX(data.length);
in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);
rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(previewSize.width).setY(previewSize.height);
out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);
}
in.copyFrom(data);
yuvToRgbIntrinsic.setInput(in);
yuvToRgbIntrinsic.forEach(out);
Bitmap bmpout = Bitmap.createBitmap(previewSize.width, previewSize.height, Bitmap.Config.ARGB_8888);
out.copyTo(bmpout);
//return adjustPhotoRotation(blurBitmap(bmpout,blurvaule),90);
return blurBitmap(bmpout,blurvaule);
}
/**
* 模糊處理Bitmap
* @param bitmap
* @return
*/
private Bitmap blurBitmap(Bitmap bitmap,float vaule) {
// 用需要創(chuàng)建高斯模糊bitmap創(chuàng)建一個空的bitmap
Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
// 初始化Renderscript,這個類提供了RenderScript context,
// 在創(chuàng)建其他RS類之前必須要先創(chuàng)建這個類,他控制RenderScript的初始化,資源管理,釋放
// 創(chuàng)建高斯模糊對象
// 創(chuàng)建Allocations,此類是將數(shù)據(jù)傳遞給RenderScript內(nèi)核的主要方法,
// 并制定一個后備類型存儲給定類型
Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);
// 設定模糊度
blurScript.setRadius(vaule);
// Perform the Renderscript
blurScript.setInput(allIn);
blurScript.forEach(allOut);
// Copy the final bitmap created by the out Allocation to the outBitmap
allOut.copyTo(outBitmap);
// recycle the original bitmap
bitmap.recycle();
// After finishing everything, we destroy the Renderscript.
rs.destroy();
return outBitmap;
}
ok,這兩個方法就夠了,將返回的Bitmap給ImageView就可以了,之前一直以為是用JNI實現(xiàn)的,試了一下才發(fā)現(xiàn)JAVA也可以,效果也不錯,網(wǎng)上也沒類似教程就寫出來給需要的人。對了,還需要在項目的build.gradle中加入
defaultConfig {
.......
renderscriptTargetApi 21
renderscriptSupportModeEnabled true
}
具體使用方法和代碼可以參考我Github的CameraView,這個控件也可以快速幫你實現(xiàn)攝像頭的預覽,拍照,加水印,高斯模糊的效果, https://github.com/bertsir/CameraView
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android 關于ExpandableListView刷新問題的解決方法
下面小編就為大家?guī)硪黄狝ndroid 關于ExpandableListView刷新問題的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
Android實現(xiàn)bitmap指定區(qū)域滑動截取功能
這篇文章主要為大家詳細介紹了Android實現(xiàn)bitmap指定區(qū)域滑動截取功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09
Android判斷和監(jiān)聽底座狀態(tài)和類型的方法介紹
這篇文章主要介紹了Android判斷和監(jiān)聽底座狀態(tài)和類型的方法介紹,例如判斷當前底座狀態(tài)、判斷插入底座類型、監(jiān)控充電充電狀態(tài)等,需要的朋友可以參考下2014-06-06
Android Studio生成 Flutter 模板代碼技巧詳解
這篇文章主要為大家介紹了Android Studio生成 Flutter 模板代碼技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
Android中實現(xiàn)OkHttp上傳文件到服務器并帶進度
本篇文章主要介紹了Android中實現(xiàn)OkHttp上傳文件到服務器并帶進度,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07

