Android RenderScript實現(xiàn)高斯模糊
昨天看了下RenderScript的官方文檔,發(fā)現(xiàn)RenderScript這廝有點牛逼。無意中發(fā)現(xiàn)ScriptIntrinsic這個抽象類,有些很有用的子類。其中有個子類叫ScriptIntrinsicBlur類,大致就是將圖片實現(xiàn)高斯模糊。
ScriptIntrinsic的申明:

ScriptIntrinsicBlur類的申明:

加上結(jié)合著看了下SDK中的samples,自己寫了個高斯模糊。
( sample的具體位置為:
SDK目錄/samples/android-19/renderscript/RenderScriptIntrinsic/RenderScriptIntrinsicSample/
)。
先上圖。效果如下:

【注意?。?開始之前,我們需要導入需要的支持包。
支持包的具體路徑為: sdk目錄/buildtools/任意一個版本號/renderscript/lib/renderscript-v8.jar
另外:為了防止出現(xiàn)有的機型兼容問題,最好將renderscript-v8.jar同目錄下的packaged目錄下的所有庫也一并拷貝到lib文件夾下】
例如:

好了。開始寫代碼。。
1、先申明常用成員變量。
private SeekBar blurSeekBar;//拖動條 private ImageView img_blur;//顯示模糊后bitmap的ImageView //原bitmap和高斯模糊后的bitmap private Bitmap bitmap_original, bitmap_blur; //高斯模糊處理的AsyncTask private RenderScriptTask mLatestTask = null; //RenderScript 對象(Google的高性能并行計算類,他可以利用設(shè)備的GPU/CPU等計算資源) private RenderScript mRS; //下面是兩個RenderScript的傳入?yún)?shù)對象 private Allocation mInAllocation; private Allocation mOutAllocation; //高斯模糊處理實例 private ScriptIntrinsicBlur mScriptBlur;
2、加載兩份bitmap,并初始化高斯模糊相關(guān)的對象。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
blurSeekBar = (SeekBar) findViewById(R.id.aty_main_seekBar);
img_blur = (ImageView) findViewById(R.id.aty_main_img_blur);
bitmap_original = loadBitmap(R.drawable.meet_entry_guide_3);
// 復制一份
bitmap_blur = Bitmap.createBitmap(bitmap_original.getWidth(),
bitmap_original.getHeight(), bitmap_original.getConfig());
createBlureScript();
setSeekBarListening();//為SeekBar設(shè)置拖拽監(jiān)聽
}
/**
* Helper to load Bitmap from resource
*/
private Bitmap loadBitmap(int resource) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
return BitmapFactory.decodeResource(getResources(), resource, options);
}
/**
* 創(chuàng)建Script
*/
private void createBlureScript() {
mRS = RenderScript.create(this);
mInAllocation = Allocation.createFromBitmap(mRS, bitmap_original);
mOutAllocation = Allocation.createFromBitmap(mRS, bitmap_blur);
/*
* Create intrinsics. RenderScript has built-in features such as blur,
* convolve filter etc. These intrinsics are handy for specific
* operations without writing RenderScript kernel. In the sample, it's
* creating blur, convolve and matrix intrinsics.
*/
mScriptBlur = ScriptIntrinsicBlur.create(mRS, Element.U8_4(mRS));
}
3、完成高斯模糊處理代碼。
private void performFilter(Allocation inAllocation,
Allocation outAllocation, Bitmap bitmapOut, float value) {
/*
* 設(shè)置模糊程度。范圍在0~25之間。否則會出錯
*/
mScriptBlur.setRadius(value);
/*
* Invoke filter kernel
*/
mScriptBlur.setInput(inAllocation);
mScriptBlur.forEach(outAllocation);
outAllocation.copyTo(bitmapOut);
}
4、將處理后的bitmap設(shè)置到ImageView中。
// Request UI update img_blur.setImageBitmap(bitmap_blur); img_blur.invalidate();
基本工作也就完成了。剩下就是代碼的相互調(diào)用了。
【 總 結(jié) 】
其實總起來,使用RenderScript進行高斯模糊主要是分為三步:
1、創(chuàng)建并初始化需要的對象(初始化一次就OK)。
mRS = RenderScript.create(this); mScriptBlur = ScriptIntrinsicBlur.create(mRS, Element.U8_4(mRS)); //RenderScript的輸入和輸出參數(shù)對象 mInAllocation = Allocation.createFromBitmap(mRS, bitmap_original); mOutAllocation = Allocation.createFromBitmap(mRS, bitmap_blur);
2、執(zhí)行高斯模糊,并將結(jié)果拷貝出來。
/* * 設(shè)置模糊程度。范圍在0~25之間。否則會出錯(這個也可以只設(shè)置一次) */ mScriptBlur.setRadius(value); /* * Invoke filter kernel */ mScriptBlur.setInput(inAllocation); mScriptBlur.forEach(outAllocation); //將結(jié)果拷貝出來,拷貝到bitmapOut對象中 outAllocation.copyTo(bitmapOut);
3、回收RenderScript對象
mRS.destory(); mRs = null;
文章到此結(jié)束。
按照慣例:下面是我的完整的代碼實現(xiàn)。
public class MainActivity extends Activity {
private SeekBar blurSeekBar;
private ImageView img_blur;
private Bitmap bitmap_original, bitmap_blur;
private RenderScriptTask mLatestTask = null;
private RenderScript mRS;
private Allocation mInAllocation;
private Allocation mOutAllocation;
private ScriptIntrinsicBlur mScriptBlur;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
blurSeekBar = (SeekBar) findViewById(R.id.aty_main_seekBar);
img_blur = (ImageView) findViewById(R.id.aty_main_img_blur);
bitmap_original = loadBitmap(R.drawable.meet_entry_guide_3);
// 復制一份
bitmap_blur = Bitmap.createBitmap(bitmap_original.getWidth(),
bitmap_original.getHeight(), bitmap_original.getConfig());
createBlureScript();
setSeekBarListening();
}
/**
* 設(shè)置SeekBar的監(jiān)聽
*/
private void setSeekBarListening() {
blurSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
updateImage(progress);
}
});
}
/**
* 創(chuàng)建Script
*/
private void createBlureScript() {
mRS = RenderScript.create(this);
mInAllocation = Allocation.createFromBitmap(mRS, bitmap_original);
mOutAllocation = Allocation.createFromBitmap(mRS, bitmap_blur);
/*
* Create intrinsics. RenderScript has built-in features such as blur,
* convolve filter etc. These intrinsics are handy for specific
* operations without writing RenderScript kernel. In the sample, it's
* creating blur, convolve and matrix intrinsics.
*/
mScriptBlur = ScriptIntrinsicBlur.create(mRS, Element.U8_4(mRS));
}
private void performFilter(Allocation inAllocation,
Allocation outAllocation, Bitmap bitmapOut, float value) {
/*
* Set blur kernel size
*/
mScriptBlur.setRadius(value);
/*
* Invoke filter kernel
*/
mScriptBlur.setInput(inAllocation);
mScriptBlur.forEach(outAllocation);
outAllocation.copyTo(bitmapOut);
}
/*
* In the AsyncTask, it invokes RenderScript intrinsics to do a filtering.
* After the filtering is done, an operation blocks at Allication.copyTo()
* in AsyncTask thread. Once all operation is finished at onPostExecute() in
* UI thread, it can invalidate and update ImageView UI.
*/
private class RenderScriptTask extends AsyncTask<Float, Integer, Integer> {
Boolean issued = false;
protected Integer doInBackground(Float... values) {
if (isCancelled() == false) {
issued = true;
performFilter(mInAllocation, mOutAllocation, bitmap_blur,
values[0]);
}
return 0;
}
void updateView(Integer result) {
// Request UI update
img_blur.setImageBitmap(bitmap_blur);
img_blur.invalidate();
}
protected void onPostExecute(Integer result) {
updateView(result);
}
protected void onCancelled(Integer result) {
if (issued) {
updateView(result);
}
}
}
/*
* Invoke AsynchTask and cancel previous task. When AsyncTasks are piled up
* (typically in slow device with heavy kernel), Only the latest (and
* already started) task invokes RenderScript operation.
*/
private void updateImage(int progress) {
float f = getBlureParam(progress);
if (mLatestTask != null)
mLatestTask.cancel(false);
mLatestTask = new RenderScriptTask();
mLatestTask.execute(f);
}
/**
* 模糊的值在1 ~ 25之間
*
* @param progress
* SeekBar的進度值(0 ~ 100)
* @return 模糊值
*/
private float getBlureParam(int progress) {
final float max = 25.0f;
final float min = 1.f;
return (float) ((max - min) * (progress / 100.0) + min);
}
/**
* Helper to load Bitmap from resource
*/
private Bitmap loadBitmap(int resource) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
return BitmapFactory.decodeResource(getResources(), resource, options);
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android關(guān)于Glide的使用(高斯模糊、加載監(jiān)聽、圓角圖片)
- Android實現(xiàn)圖片的高斯模糊(兩種方式)
- Android圖片特效:黑白特效、圓角效果、高斯模糊
- Android實現(xiàn)動態(tài)高斯模糊效果
- Android 實現(xiàn)圖片模糊、高斯模糊、毛玻璃效果的三種方法
- Android 動態(tài)高斯模糊效果教程
- Android 高仿微信語音聊天頁面高斯模糊(毛玻璃效果)
- Android項目實戰(zhàn)之Glide 高斯模糊效果的實例代碼
- Android實現(xiàn)動態(tài)高斯模糊效果示例代碼
- Android實現(xiàn)圖片高斯模糊
相關(guān)文章
Android獲取超級管理員權(quán)限的實現(xiàn)
這篇文章主要介紹了Android獲取超級管理員權(quán)限的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
RXjava網(wǎng)絡(luò)獲取圖片數(shù)據(jù)的方法
這篇文章主要為大家詳細介紹了RXjava網(wǎng)絡(luò)獲取圖片數(shù)據(jù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08
Android編程布局(Layout)之AbsoluteLayout用法實例分析
這篇文章主要介紹了Android編程布局(Layout)之AbsoluteLayout用法,結(jié)合實例形式簡單分析了Android絕對布局AbsoluteLayout的實現(xiàn)方法,需要的朋友可以參考下2015-12-12
android 網(wǎng)絡(luò)請求庫volley方法詳解
這篇文章主要介紹了android 網(wǎng)絡(luò)請求庫volley方法詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09
Android SharedPreference存儲文件三步走
SharedPreferences是安卓平臺上一個輕量級的存儲類,用來保存應用的一些常用配置,比如Activity狀態(tài),Activity暫停時,將此activity的狀態(tài)保存到SharedPereferences中;當Activity重載,系統(tǒng)回調(diào)方法onSaveInstanceState時,再從SharedPreferences中將值取出2023-01-01
Android巧用ViewPager實現(xiàn)左右循環(huán)滑動圖片
這篇文章主要為大家詳細介紹了Android巧用ViewPager實現(xiàn)左右循環(huán)滑動圖片的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05
一文帶你了解Android?Flutter中Transform的使用
flutter的強大之處在于,可以對所有的widget進行Transform,因此可以做出非常酷炫的效果。本文就來大家了解一下Transform的具體使用,感興趣的可以了解一下2023-01-01
Android AsyncTask完全解析 帶你從源碼的角度徹底理解
這篇文章主要是針對Android AsyncTask進行完全解析,帶你從源碼的角度徹底理解,感興趣的小伙伴們可以參考一下2016-04-04

