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

注意了,這不是對(duì)單純的圖片進(jìn)行高斯模糊,而是對(duì)攝像頭實(shí)時(shí)處理
原理:
大體講一下實(shí)現(xiàn)原理,攝像頭回調(diào)的每一幀通過RenderScript將字節(jié)數(shù)組轉(zhuǎn)換為Bitmap,再對(duì)Bitmap進(jìn)行高斯模糊處理。流暢度還是不錯(cuò)的。畢竟RenderScript使用的是GPU去計(jì)算,速度比普通的用CPU計(jì)算的方法快的多
核心代碼:
/**
* 轉(zhuǎn)換數(shù)據(jù)并進(jìn)行模糊處理
*/
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) {
// 用需要?jiǎng)?chuàng)建高斯模糊bitmap創(chuàng)建一個(gè)空的bitmap
Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
// 初始化Renderscript,這個(gè)類提供了RenderScript context,
// 在創(chuàng)建其他RS類之前必須要先創(chuàng)建這個(gè)類,他控制RenderScript的初始化,資源管理,釋放
// 創(chuàng)建高斯模糊對(duì)象
// 創(chuàng)建Allocations,此類是將數(shù)據(jù)傳遞給RenderScript內(nèi)核的主要方法,
// 并制定一個(gè)后備類型存儲(chǔ)給定類型
Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);
// 設(shè)定模糊度
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,這兩個(gè)方法就夠了,將返回的Bitmap給ImageView就可以了,之前一直以為是用JNI實(shí)現(xiàn)的,試了一下才發(fā)現(xiàn)JAVA也可以,效果也不錯(cuò),網(wǎng)上也沒類似教程就寫出來給需要的人。對(duì)了,還需要在項(xiàng)目的build.gradle中加入
defaultConfig {
.......
renderscriptTargetApi 21
renderscriptSupportModeEnabled true
}
具體使用方法和代碼可以參考我Github的CameraView,這個(gè)控件也可以快速幫你實(shí)現(xiàn)攝像頭的預(yù)覽,拍照,加水印,高斯模糊的效果, https://github.com/bertsir/CameraView
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android編程基礎(chǔ)之獲取手機(jī)屏幕大小(DisplayMetrics應(yīng)用)示例
這篇文章主要介紹了Android獲取手機(jī)屏幕大小的方法,結(jié)合實(shí)例形式分析了TextView ,Button ,以及DisplayMetrics的使用方法,并重點(diǎn)分析了DisplayMetrics的應(yīng)用技巧,需要的朋友可以參考下2016-10-10
Android RecyclerView網(wǎng)格布局(支持多種分割線)詳解(2)
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView網(wǎng)格布局,支持多種分割線,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
android開發(fā)教程之獲取使用當(dāng)前api的應(yīng)用程序名稱
開發(fā)手機(jī)安全管家的時(shí)候,比如要打電話,或者照相需要知道是哪個(gè)應(yīng)用程序在調(diào)用,就可以在API接口中調(diào)用下面的代碼2014-02-02
Kotlin FrameLayout與ViewPager2控件實(shí)現(xiàn)滾動(dòng)廣告欄方法
這篇文章主要介紹了Kotlin FrameLayout與ViewPager2控件實(shí)現(xiàn)滾動(dòng)廣告欄,F(xiàn)rameLayout與ViewPager2是Android開發(fā)中非常常見的布局組件,并且它不單單是一個(gè)幀布局組件,可以用它實(shí)現(xiàn)多種功能,感興趣的朋友一起來看看吧2022-12-12
Android實(shí)現(xiàn)動(dòng)態(tài)添加標(biāo)簽及其點(diǎn)擊事件
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)動(dòng)態(tài)添加標(biāo)簽及其點(diǎn)擊事件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
解決java.lang.NoClassDefFoundError: android.support.v4.animati
這篇文章主要介紹了解決Android Studio出現(xiàn)java.lang.NoClassDefFoundError: android.support.v4.animation.AnimatorCompatHelper的問題,感興趣的朋友一起看看吧2021-08-08
Kotlin中關(guān)于內(nèi)聯(lián)函數(shù)的一些理解分享
這篇文章主要給大家介紹了關(guān)于Kotlin中內(nèi)聯(lián)函數(shù)的一些理解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
Android ListView出現(xiàn)異常解決辦法
這篇文章主要介紹了Android ListView出現(xiàn)異常ListView:The content of the adapter has changed but ListView did not receive a notification解決辦法的相關(guān)資料,需要的朋友可以參考下2016-11-11
Android實(shí)現(xiàn)系統(tǒng)日歷同步日程
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)系統(tǒng)日歷同步日程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
Android setButtonDrawable()的兼容問題解決辦法
這篇文章主要介紹了Android setButtonDrawable()的兼容問題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-03-03

