91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Android開發中利用RenderScript實現一個動態高斯模糊效果

發布時間:2020-11-20 16:12:16 來源:億速云 閱讀:562 作者:Leah 欄目:移動開發

在Android開發中利用RenderScript實現一個動態高斯模糊效果?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

什么是RenderScript

RenderScript是一種低級的高性能編程語言,用于3D渲染和處理密集型計算(3D播放等和關于CPU密集型的計算)。一直以來Android 在繪圖性能的表現一直差強人意,引入NDK之后才有所改善,而在Honeycomb 中發布了RenderScript 這一殺手級在Framework 后,大大的增加了Android本地語言的執行能力和計算能力。現在網上介紹RenderScript的文章非常少,附上一篇博客,大家可以能更好理解這門語言。

如果需要詳細了解,可以查看官方文檔RenderScript

動態模糊的實現

使用之前,先要在Module build.gradle里面作下面的定義:

在Android開發中利用RenderScript實現一個動態高斯模糊效果

MainActivity.java

package com.jackie.blurimage; 
 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.ImageView; 
import android.widget.SeekBar; 
import android.widget.TextView; 
 
public class MainActivity extends AppCompatActivity { 
  private ImageView mBlurImage, mOriginImage; 
  private SeekBar mSeekBar; 
  private TextView mSeekProgress; 
 
  private int mAlpha; 
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
 
    initView(); 
    initData(); 
    initEvent(); 
  } 
 
  private void initView() { 
    mBlurImage = (ImageView) findViewById(R.id.blur_image); 
    mOriginImage = (ImageView) findViewById(R.id.origin_image); 
    mSeekBar = (SeekBar) findViewById(R.id.seek_bar); 
    mSeekProgress = (TextView) findViewById(R.id.seek_progress); 
  } 
 
  private void initData() { 
    // 獲取圖片 
    Bitmap originBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.blur); 
    Bitmap blurBitmap = BlurUtils.blur(this, originBitmap); 
 
    // 填充模糊后的圖像和原圖 
    mBlurImage.setImageBitmap(blurBitmap); 
    mOriginImage.setImageBitmap(originBitmap); 
  } 
 
  private void initEvent() { 
    mSeekBar.setMax(100); 
 
    mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
        mAlpha = progress; 
 
        mOriginImage.setAlpha((int) (255 - mAlpha * 2.55)); 
        mSeekProgress.setText(String.valueOf(mAlpha)); 
      } 
 
      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
 
      } 
 
      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
 
      } 
    }); 
  } 
} 

activity_main.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:orientation="vertical"> 
 
  <FrameLayout 
    android:layout_width="match_parent" 
    android:layout_weight="1" 
    android:layout_height="0dp"> 
 
    <ImageView 
      android:id="@+id/blur_image" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scaleType="centerCrop" 
      android:src="@drawable/blur"/> 
 
    <ImageView 
      android:id="@+id/origin_image" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scaleType="centerCrop"/> 
  </FrameLayout> 
 
  <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="80dp" 
    android:orientation="vertical"> 
 
    <SeekBar 
      android:id="@+id/seek_bar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="16dp" 
      android:layout_marginRight="16dp" 
      android:layout_marginTop="@dimen/activity_vertical_margin"/> 
 
    <TextView 
      android:id="@+id/seek_progress" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:text="0" 
      android:textSize="24sp"/> 
  </LinearLayout> 
</LinearLayout> 

從上面的代碼可以看出,在FrameLayout上放了兩張圖片,然后動態更改圖片的透明度來達到動態模糊效果。

BlurUtils.java

package com.jackie.blurimage; 
 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.renderscript.Allocation; 
import android.renderscript.Element; 
import android.renderscript.RenderScript; 
import android.renderscript.ScriptIntrinsicBlur; 
 
/** 
 * Created by Jackie on 2017/1/21. 
 * 高斯模糊工具類 
 */ 
 
public class BlurUtils { 
  /** 
   * 圖片縮放比例 
   */ 
  private static final float SCALE_DEGREE = 0.4f; 
  /** 
   * 最大模糊度(在0.0到25.0之間) 
   */ 
  private static final float BLUR_RADIUS = 25f; 
 
  /** 
   * 模糊圖片 
   * @param context  上下文 
   * @param bitmap  需要模糊的圖片 
   * @return     模糊處理后的圖片 
   */ 
  public static Bitmap blur(Context context,Bitmap bitmap) { 
    //計算圖片縮小的長寬 
    int width = Math.round(bitmap.getWidth() * SCALE_DEGREE); 
    int height = Math.round(bitmap.getHeight() * SCALE_DEGREE); 
 
    //將縮小后的圖片作為預渲染的圖片 
    Bitmap inputBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false); 
    //創建一張渲染后的輸入圖片 
    Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); 
 
    //創建RenderScript內核對象 
    RenderScript renderScript = RenderScript.create(context); 
    //創建一個模糊效果的RenderScript的工具對象 
    ScriptIntrinsicBlur scriptIntrinsicBlur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)); 
 
    /** 
     * 由于RenderScript并沒有使用VM來分配內存,所以需要使用Allocation類來創建和分配內存空間。 
     * 創建Allocation對象的時候其實內存是空的,需要使用copyTo()將數據填充進去。 
     */ 
    Allocation inputAllocation = Allocation.createFromBitmap(renderScript, inputBitmap); 
    Allocation outputAllocation = Allocation.createFromBitmap(renderScript, outputBitmap); 
 
    //設置渲染的模糊程度,25f是最大模糊度 
    scriptIntrinsicBlur.setRadius(BLUR_RADIUS); 
    //設置ScriptIntrinsicBlur對象的輸入內存 
    scriptIntrinsicBlur.setInput(inputAllocation); 
    //將ScriptIntrinsicBlur輸出數據保存到輸出內存中 
    scriptIntrinsicBlur.forEach(outputAllocation); 
 
    //將數據填充到Allocation中 
    outputAllocation.copyTo(outputBitmap); 
 
    return outputBitmap; 
  } 
} 

效果圖如下,妹紙一枚!

在Android開發中利用RenderScript實現一個動態高斯模糊效果

看完上述內容,你們掌握在Android開發中利用RenderScript實現一個動態高斯模糊效果的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丁青县| 获嘉县| 嵩明县| 永平县| 南投县| 克山县| 昌平区| 旅游| 望谟县| 英德市| 新巴尔虎右旗| 海林市| 油尖旺区| 峨眉山市| 偃师市| 景东| 余姚市| 四川省| 曲沃县| 荣成市| 宁强县| 台北县| 丰镇市| 巴林右旗| 惠东县| 美姑县| 玉林市| 景泰县| 泊头市| 股票| 墨江| 布拖县| 金川县| 舞阳县| 饶阳县| 阿克陶县| 南川市| 镇江市| 洱源县| 成武县| 林甸县|