Android 동적 가우스 퍼 지 효과 예제 코드 구현
현재 점점 더 많은 앱 에서 모호 효 과 를 사 용 했 는데 이런 모호 효 과 를 고 스 모호 라 고 부른다.안 드 로 이 드 플랫폼 에서 퍼 지 렌 더 링 을 하 는 것 은 CPU 도 상당히 소모 되 고 시간 도 많이 걸 리 는 작업 으로 처리 가 잘 되 지 않 으 면 카드 가 걸 리 는 것 이 불가피 하 다 는 것 을 잘 알 고 있 습 니 다.일반적으로 효율 을 고려 하여 한 장의 그림 을 과장 하 는 가장 좋 은 방법 은 OpenGL 을 사용 하 는 것 이 고,그 다음은 C++/C 를 사용 하 는 것 이 며,자바 코드 를 사용 하 는 것 이 효율 이 가장 낮 고 속도 도 가장 느리다.그러나 Android 가 RenderScript 를 출시 한 후에 우 리 는 선택 을 했 습 니 다.테스트 에 따 르 면 RederScript 를 사용 하 는 렌 더 링 효율 은 C++C 를 사용 하 는 것 과 막상막하 이지 만 RenderScript 를 사용 하 는 것 은 JNI 를 사용 하 는 것 보다 훨씬 간단 합 니 다!또한,Android 팀 은 낮은 버 전의 Android 플랫폼 에서 도 사용 할 수 있 도록 RenderScript 지원 라 이브 러 리 를 제공 합 니 다.
그러나 RenderScript 를 사용 하기 전에 모호 한 그림 에 대해 주의해 야 할 것 은 원래 사이즈 해상도 의 그림 을 사용 하지 말고 그림 의 비율 을 줄 이 는 것 이 좋 습 니 다.이 작은 렌 더 링 의 효율 이 높 고 속도 도 빠 릅 니 다.
렌 더 스 크 립 트 가 뭐야?
RenderScript 는 저급한 고성능 프로 그래 밍 언어 로 3D 렌 더 링 과 처리 밀집 형 컴 퓨 팅(3D 재생 등 과 CPU 밀집 형 컴 퓨 팅)에 사용 된다.그동안 안 드 로 이 드 는 그래 픽 성능 이 좋 지 않 았 고 NDK 를 도입 한 후에 야 개선 되 었 으 며,Honey comb 에서 RenderScript 라 는 킬러 급 은 Framework 이후 안 드 로 이 드 로 컬 언어의 실행 능력 과 컴 퓨 팅 능력 을 크게 증가 시 켰 다.현재 인터넷 상에 서 RenderScript 를 소개 하 는 글 은 매우 적 고 블 로 그 를 한 편 동봉 하면 여러분 들 은 이 언어 를 더욱 잘 이해 할 수 있 습 니 다.
자세히 알 고 싶 으 면 공식 문 서 를 볼 수 있 습 니 다RenderScript
동적 모호 한 실현
사용 하기 전에 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"?>
<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;
}
}
효과 도 는 다음 과 같 습 니 다.여동생 종이 하나!이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.