在Android開發(fā)中利用RenderScript實(shí)現(xiàn)一個(gè)動(dòng)態(tài)高斯模糊效果?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
成都創(chuàng)新互聯(lián)公司憑借專業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢,提供專業(yè)的網(wǎng)站策劃、成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)站優(yōu)化、軟件開發(fā)、網(wǎng)站改版等服務(wù),在成都十年的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都1000多家中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。
什么是RenderScript
RenderScript是一種低級(jí)的高性能編程語言,用于3D渲染和處理密集型計(jì)算(3D播放等和關(guān)于CPU密集型的計(jì)算)。一直以來Android 在繪圖性能的表現(xiàn)一直差強(qiáng)人意,引入NDK之后才有所改善,而在Honeycomb 中發(fā)布了RenderScript 這一殺手級(jí)在Framework 后,大大的增加了Android本地語言的執(zhí)行能力和計(jì)算能力。現(xiàn)在網(wǎng)上介紹RenderScript的文章非常少,附上一篇博客,大家可以能更好理解這門語言。
如果需要詳細(xì)了解,可以查看官方文檔RenderScript
動(dòng)態(tài)模糊的實(shí)現(xiàn)
使用之前,先要在Module build.gradle里面作下面的定義:
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
<?xml version="1.0" encoding="utf-8"?>
從上面的代碼可以看出,在FrameLayout上放了兩張圖片,然后動(dòng)態(tài)更改圖片的透明度來達(dá)到動(dòng)態(tài)模糊效果。
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) { //計(jì)算圖片縮小的長寬 int width = Math.round(bitmap.getWidth() * SCALE_DEGREE); int height = Math.round(bitmap.getHeight() * SCALE_DEGREE); //將縮小后的圖片作為預(yù)渲染的圖片 Bitmap inputBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false); //創(chuàng)建一張渲染后的輸入圖片 Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); //創(chuàng)建RenderScript內(nèi)核對(duì)象 RenderScript renderScript = RenderScript.create(context); //創(chuàng)建一個(gè)模糊效果的RenderScript的工具對(duì)象 ScriptIntrinsicBlur scriptIntrinsicBlur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)); /** * 由于RenderScript并沒有使用VM來分配內(nèi)存,所以需要使用Allocation類來創(chuàng)建和分配內(nèi)存空間。 * 創(chuàng)建Allocation對(duì)象的時(shí)候其實(shí)內(nèi)存是空的,需要使用copyTo()將數(shù)據(jù)填充進(jìn)去。 */ Allocation inputAllocation = Allocation.createFromBitmap(renderScript, inputBitmap); Allocation outputAllocation = Allocation.createFromBitmap(renderScript, outputBitmap); //設(shè)置渲染的模糊程度,25f是最大模糊度 scriptIntrinsicBlur.setRadius(BLUR_RADIUS); //設(shè)置ScriptIntrinsicBlur對(duì)象的輸入內(nèi)存 scriptIntrinsicBlur.setInput(inputAllocation); //將ScriptIntrinsicBlur輸出數(shù)據(jù)保存到輸出內(nèi)存中 scriptIntrinsicBlur.forEach(outputAllocation); //將數(shù)據(jù)填充到Allocation中 outputAllocation.copyTo(outputBitmap); return outputBitmap; } }
效果圖如下,妹紙一枚!
看完上述內(nèi)容,你們掌握在Android開發(fā)中利用RenderScript實(shí)現(xiàn)一個(gè)動(dòng)態(tài)高斯模糊效果的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!