본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] Paint에 Filter 적용하기 + draw에 효과주기.

by 돼지왕 왕돼지 2012. 2. 18.
반응형


안녕하세요. 돼지왕 왕돼지입니다.
오늘은 Paint 에 Filter 를 적용하는 방법과 draw 할 때 효과를 주는 방법에 대해 알아보겠습니다.


마스크 필터 ( Mask Filter )


Filter 적용하기


MaskFilter Paint.setMaskFilter (MaskFilter maskfilter)
 cf) 필터를 제거하고 싶을때는 filter parameter 에 null 값을 대입합니다. 

 
 

MaskFilter


BlurMaskFilter(float radius, BlurMaskFilter.Blur style)

  -> 가장자리 부분의 색상을 흐릿하게(or 부드럽게) 만듭니다. (뽀샤시 효과와 비슷합니다)
  -> radius 값이 클수록 영향 받는 영역이 넓어집니다.
  -> style : INNER, NORMAL, OUTER, SOLID 가 들어갈 수 있습니다.


EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)

 






Example


 <example 1>

setContentView (new MyView(this));
 
protected class MyView extends View{
   public MyView(Context context){
      super(context);
   }
 
   public void onDraw(Canvas canvas){
      Paint Pnt = new Paint();
      Pnt.setAntiAlias(true);
 
      Bitmap e8 = BitmapFactory.decodeResource( getContext.getResources(), R.drawable.eight8 );
      canvas.drawColor(Color.WHITE);

      BlurMaskFilter blur = new BlurMaskFilter( 10, BlurMaskFilter.Blur.NORMAL );
      Pnt.setMaskFilter(blur);
      canvas.drawBitmap(e8, 30, 30, Pnt);
   }
}

 
 
<example 2>  

//각 방향으로 2픽셀만큼 떨어진 위치에서 빛을 비추며 강도는 50%.
EmbossMaskFilter emboss = new EmbossMaskFilter(new float[] {2, 2, 2}, 0.5f, 6, 5);
Pnt.setMaskFilter(emboss);

 




 

컬러 필터 ( Color Filter )

  

Filter 적용하기


 ColorFilter Paint.setColorFilter (ColorFilter filter)

cf) 기존 filter 를 제거하려면, filter parameter 에 null 대입.



Color Filter.

 

LightingColorFilter (int mul, int add)

   -> RGB 채널 각 색상에 mul 값을 곱하고 add 값을 더해서 색상 요소의 값 변경 (0~255)
 

ColorMatrixColorFilter(float[] array)


 

PorterDuffColorFilter(int srcColor, PorterDuff.Mode mode)



 

Example.

 
<example 1>

// 128/256 = 0.5 를 곱한다. 뒤에 0은 더해지는 값. 양수를 더해지면 밝아진다.
Pnt.setColorFilter(new LightingColorFilter(128, 0)); 


<example 2>

// 반전 효과
ColorMatrix cm = new ColorMatrix(new float[]{
   -1, 0, 0, 0, 255,
   0, -1, 0, 0, 255,
   0, 0, -1, 0, 255,
   0, 0, 0, 1, 0});
Pnt.setColorFilter(new ColorMatrixColorFilter(cm));

 -> 연산해보면 r' = 255 - r,    g' = 255 - g,    b' = 255 - b  뭐 이런식으로 반전효과를 준다.
 -> 곱해지는 것들은 r, g, b, a, 1 순서.
 

<example 3>

// Gray Scale
ColorMatrix cm = new ColorMatrix(new float[]{
      0.299f, 0.587f, 0.114f, 0, 0,
      0.299f, 0.587f, 0.114f, 0, 0,
      0.299f, 0.587f, 0.114f, 0, 0,
      0, 0, 0, 1, 0 });
Pnt.setColorFilter(new ColorMatrixColorFilter(cm)); 


<example 4>

// Gray Scale (Porter Duff 필터 이용)
Pnt.setColorFilter( new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.DARKEN) ); 






패스 효과 ( Path Effect )

   : 도형의 외곽선에 적용. 선의 굵기, 조인 모양, 끝 모양 등
 

APIs.,


PathEffect Paint.setPathEffect (PathEffect effect)
 
DashPathEffect (float[] intervals, float phase)
CornerPathEffect (float radius)
PathDashPathEffect (Path shape, float advance, float phase, PathDashPathEffect.Style style)
DiscretePathEffect (float segmentLength, float deviation)
SumPathEffect (PathEffect first, PathEffect second)
ComposePathEffect (PathEffect outerpe, PathEffect innerpe) 




Example.

 
 <example 1>

Pnt.setColor(Color.WHITE);
Pnt.setStrokeWidth(3);
Pnt.setPathEffect(new DashPathEffect(new float[]{10, 10}, 0));
canvas.drawLine(10, 10, 200, 10, Pnt);
 
// phase 3 이동 (왼쪽으로 3 이동한 효과)
Pnt.setPathEffect(new DashPathEffect(new float[] {10, 10}, 3));
canvas.drawLine(10, 30, 20, 30, Pnt);
 
// 2그리고 2쉬고 패턴 (위는 10 그리고 10 쉬는 패턴)
Pnt.setPathEffect(new DashPathEffect(new float[] {2, 2}, 0));
 
 
 <example 2> 

Pnt.setColor(Color.WHITE);
 
canvas.drawRect(10, 10, 100, 50, Pnt);
Pnt.setPathEffect( new CornerPathEffect(8) ); 
 
 
<example 3>

Path dash = new Path();
dash.moveTo(0.-4);
dash.lineTo(4, -4);
dash.lineTo(4, -8);
dash.lineTo(10, 0);
dash.lineTo(4, 8);
dash.lineTo(4, 4);
dash.lineTo(0, 4);
 
PathDashPathEffect pathdash = new PathDashPathEffect( dash, 14, 0, PathDashPathEffect.Style.ROTATE );
Pnt.setPathEffect (pathdash);
canvas.drawLine(10, 10, 10, 200, Pnt);
canvas.drawCircle(180, 100, 80, Pnt);
 
ComposePathEffect comp = new ComposePathEffect( pathdash, new CornerPathEffect(16) );
Pnt.setPathEffect(comp);
canvas.drawRect(50, 200, 250, 300, Pnt); 
 

<example 4>

int phase = 0;
RectF ovalrt = new RectF(10, 10, 200, 150);
mAnimHandler.sendEmptyMessageDelayed(0, 100);
 
public void onDraw(Canvas canvas){
   PathDashPathEffect pathdash = new PathDashPathEffect(dash, 14, phase, PathDashPathEffect.Style.ROTATE);
   Pnt.setPathEffect(pathdash);
   canvas.drawOval(ovalrt, Pnt);
}
 
   Handler mAnimHandler = new Handler(){
      public void handleMessage(Message msg){
         phase--;
         invalidate();
         sendEmptyMessageDelayed(0, 100);
      }
   }; 
 
 
 
 
  

그리기 모드

 

APIs.

 

Xfermode Paint.setXfermode (Xfermode xfermode)
void Paint.setDither (boolean dither)  // 이미지보다 장비의 표현력이 떨어질 때 이미지의 색상을 낮추어 출력하는 기법.


 
 

Example


Paint Pnt = new Paint();
Pnt.setAntiAlias(true);
 
Pnt.setColor(Color.RED);
canvas.drawCircle(100, 100, 80, Pnt);
 
Pnt.setXfermode ( new PixelXorXfermode(Color.BLACK) );
 
Pnt.setColor(Color.BLUE);
canvas.drawRect(100, 100, 200, 200, Pnt);
 


로그인 없이 추천 가능합니다. 손가락 꾸욱~





반응형

댓글