国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android RenderScript實(shí)現(xiàn)高斯模糊

2019-12-12 04:23:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

ScriptIntrinsic的申明:

ScriptIntrinsic申明

ScriptIntrinsicBlur類的申明:

ScriptIntrinsicBlur類的申明

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

先上圖。效果如下:

高斯模糊效果圖

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

例如:

截圖實(shí)例

好了。開(kāi)始寫(xiě)代碼。。

1、先申明常用成員變量。

private SeekBar blurSeekBar;//拖動(dòng)條private ImageView img_blur;//顯示模糊后bitmap的ImageView//原bitmap和高斯模糊后的bitmapprivate Bitmap bitmap_original, bitmap_blur;//高斯模糊處理的AsyncTaskprivate RenderScriptTask mLatestTask = null;//RenderScript 對(duì)象(Google的高性能并行計(jì)算類,他可以利用設(shè)備的GPU/CPU等計(jì)算資源)private RenderScript mRS;//下面是兩個(gè)RenderScript的傳入?yún)?shù)對(duì)象private Allocation mInAllocation;private Allocation mOutAllocation;//高斯模糊處理實(shí)例private ScriptIntrinsicBlur mScriptBlur;

2、加載兩份bitmap,并初始化高斯模糊相關(guān)的對(duì)象。

@Overrideprotected 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);  // 復(fù)制一份  bitmap_blur = Bitmap.createBitmap(bitmap_original.getWidth(),      bitmap_original.getHeight(), bitmap_original.getConfig());  createBlureScript();  setSeekBarListening();//為SeekBar設(shè)置拖拽監(jiān)聽(tīng)}/** * 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之間。否則會(huì)出錯(cuò)   */  mScriptBlur.setRadius(value);  /*   * Invoke filter kernel   */  mScriptBlur.setInput(inAllocation);  mScriptBlur.forEach(outAllocation);  outAllocation.copyTo(bitmapOut);}

4、將處理后的bitmap設(shè)置到ImageView中。

// Request UI updateimg_blur.setImageBitmap(bitmap_blur);img_blur.invalidate();

基本工作也就完成了。剩下就是代碼的相互調(diào)用了。

【 總 結(jié) 】
其實(shí)總起來(lái),使用RenderScript進(jìn)行高斯模糊主要是分為三步:

1、創(chuàng)建并初始化需要的對(duì)象(初始化一次就OK)。

mRS = RenderScript.create(this);mScriptBlur = ScriptIntrinsicBlur.create(mRS, Element.U8_4(mRS));//RenderScript的輸入和輸出參數(shù)對(duì)象mInAllocation = Allocation.createFromBitmap(mRS, bitmap_original);mOutAllocation = Allocation.createFromBitmap(mRS, bitmap_blur);

2、執(zhí)行高斯模糊,并將結(jié)果拷貝出來(lái)。

/* * 設(shè)置模糊程度。范圍在0~25之間。否則會(huì)出錯(cuò)(這個(gè)也可以只設(shè)置一次) */mScriptBlur.setRadius(value);/* * Invoke filter kernel */mScriptBlur.setInput(inAllocation);mScriptBlur.forEach(outAllocation);//將結(jié)果拷貝出來(lái),拷貝到bitmapOut對(duì)象中outAllocation.copyTo(bitmapOut);

3、回收RenderScript對(duì)象

mRS.destory();mRs = null; 

文章到此結(jié)束。

按照慣例:下面是我的完整的代碼實(shí)現(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);    // 復(fù)制一份    bitmap_blur = Bitmap.createBitmap(bitmap_original.getWidth(),        bitmap_original.getHeight(), bitmap_original.getConfig());    createBlureScript();    setSeekBarListening();  }  /**   * 設(shè)置SeekBar的監(jiān)聽(tīng)   */  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的進(jìn)度值(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);  }}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 滕州市| 延川县| 德江县| 大理市| 南宫市| 托里县| 沅江市| 牡丹江市| 毕节市| 惠安县| 陆丰市| 镇远县| 龙川县| 西乌珠穆沁旗| 元朗区| 云和县| 密山市| 岗巴县| 健康| 龙海市| 武鸣县| 惠安县| 湘潭市| 瓮安县| 吉林省| 沂水县| 康马县| 青神县| 皮山县| 海林市| 葫芦岛市| 唐海县| 长春市| 个旧市| 府谷县| 巨野县| 建湖县| 垦利县| 郎溪县| 家居| 手游|