스마트기기개발관련/안드로이드 개발

안드로이드|android bitmap,paint 효과 (안티엘리어싱, 부드럽게, 반전 등등) 적용 관련

AlrepondTech 2020. 9. 19. 04:41
반응형

 

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

 

 

 

출처: http://www.androidpub.com/1743216

매트릭스로 회전시킨 이미지뷰를 캡쳐했는데

 

이미지가 그대로 계단현상이 나타나네요.

 

계단현상을 없애고 싶은데 무슨 좋은 방법 없을까요?

 

capture.jpg
0.11MB

 

 

목록

엮인글 주소 : http://www.androidpub.com/index.php?document_srl=1743216&act=trackback&key=710

 

2011.09.08 09:45:25

Positive

setDrawFilte메소드에 ANTI_ALIAS_FLAG 를 주시면 해결될것같네요 ^^;

저도 찾아본거라 직접 적용은 못해봤네요.

 

cv.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG))

 

다음사이트도 참고해보세요 ~~

http://stackoverflow.com/questions/3002094/how-to-rotate-a-drawable-with-anti-aliasing-enabled

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

출처: http://marcof.tistory.com/124

 

1. Canvas tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 캔버스는 뷰의 그리기 표면이며 이 위에 그림을 그린다. 그리기를 할 때마다 시스템이 초기화하여 뷰의 onDraw 메소드로 전달하므로 따로 생성할 필요 없이 전달받은 인수를 사용하면 된다.

- 모든 그리기 메소드의 마지막 인수는 색상이나, 글꼴등을 지정하는 Paint객체이다.

- 2D를 위한 표면이다, 3D의 경우 Surface 뷰를 사용한다.tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

 

2. Painttompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 페인트 객체는 그리기에 대한 속성 정보를 가지며 모든 그리기 메소드에 인수로 전달된다. new 연산자로 빈 Paint 객체를 생성하면 가장 무난한 디폴트 속성으로 생성된다. tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 페인트의 대표적인 속성은 안티 알리아싱이며 다음 메소드로 지정한다.

setAntiAlias(boolean aa)  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

안티 알리아싱은 색상차가 뚜렷한 경계 부근에 중간 색을 삽입하여 도형이나 글꼴이 주변 배경과 부드럽게 잘 어울리도록 하는 기법이다. 안티 알리아싱을 사용하면 출력 품질은 좋아지지만 중간 색상을 삽입하기 위한 연산을 해야 하므로 속도는 떨어진다.

- 아예 Paint 객체를 생성할 때 이 옵션을 지정할 수도 있다. new Paint(Paint.ANTI_ALIAS_FLAG)

 

3. Bitmaptompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 작도 메소드는 기본 도형을 그리기에는 적합하지만 사진 같은 복잡한 모양을 그리기에는 역부족하다. 그래서 화면 장식에는 미리 그려진 그림인 비트맵을 주로 많이 사용한다. tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 리소스로부터 로드한 비트맵을 화면으로 출력할 때는 Canvas의 drawBitmap 메소드를 사용한다.

- 객체 Factory 관리를 위한 BitmapFactory 클래스가 있다 BitmapFactory는 여러 가지 이미지 포맷을 decode해서 bitmap으로 변환하는 함수들로 되어 있다. 한마디로 Bitmap Object를 쉽게 만들 수 있도록 도와주는 클래스. 전부 static이며 decodeXXX라는 이름을 가진 메소드들로 이루어져 있다.

 

4. 애니메이션 타입 tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 프레임 애니메이션 : 주기적으로 그림을 교체하는 전통적인 방법이다. 일련의 정지된 그림을 빠르게 교체하면 움직이는 것처럼 보인다.

- 트윈 애니메이션 : 위치 이동이나 크기 변경, 회전 등의 효과를 일정한 시간내에 수행하여 애니메이션을 진행한다. 수학적 계산에 의해 장면들을 생성하므로 움직임이 부드럽고 여러 가지 효과를 조합할 수 있다.  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

 

5. SurfaceView   tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 일반 뷰는 캔버스에 그리기를 수행한다. 모든 그리기는 자동으로 더블 버퍼링되므로 깜빡거림은 전혀 없다. 그러나 메인 스레드에서 그려야 하므로 속도가 빠르지 못하며 그리기를 하는 동안에는 사용자의 입력을 받을 수 없으므로 반응성이 좋지 못하다. 그리기 연산이 복잡한 프로그램은 onDraw를 실행하는 동안 스레드가 잠시 멈춘 것처럼 보이며 일시적으로 입력에 반응하지 못한다. 그렇다고 해서 그리기 동작을 스레드로 분리할 수도 없는데 왜냐하면 메인이 아닌 스레드는 뷰나 캔버스를 직접적으로 건드리지 못하기 때문이다. 이런 여러 가지 문제점을 해결하기 위한 장치가 바로 서피스 뷰이다.

 

- 일반 뷰는 캔버스를 가지지만 SurfaceView는 표면을 가진다. 표면(Surface)은 쉽게 말해 메모리에 있는 가상 화면이다. 어디까지나 메모리일 뿐이므로 스레드에서 미리 출력해 놓을 수 있으며 스레드가 표면에 그리는 동안 메인 스레드는 사용자의 입력을 즉시 처리할 수 있다. 표면은 메모리에 있을 뿐이지 화면과 구조가 같으므로 캔버스에 출력하는 것과 동일한 방법으로 출력한다.  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

 

- 서피스를 사용하려면 SurfaceView를 상속받는 뷰 클래스를 만든다. 뷰를 만든다고 해서 표면이 바로 생성되는 것은 아니며 뷰가 윈도우 관리자에 등록되고 레이아웃을 완료하여 크기와 위치가 결정된 후에 생성된다.  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

 

- 스레드는 표면이 준비되었을 때만 그리기를 해야하며 표면이 파괴되면 더 이상 그리기를 해서는 안된다. 따라서 메인 스레드는 표면의 변화를 통지받고 스레드에게 그리기 허용 여부를 알려주어야 하는데 이를 위해 SurfaceHolder.Callback 인터페이스의 다음 메소드를 구현해야 한다.

void surfaceCreated(SurfaceHolder holder)  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

표면이 처음 생성된 직후에 호출된다. 이 메소드가 호출된 이후부터 표면에 그리기가 허용된다. 단, 표면에는 한 스레드만 그리기를 수행할 수 있다. 메인 스레드가 이 콜백을 구현했다면 이 메소드가 호출되었을 때 그리기 스레드를 생성해야 한다.

void surfaceDestoryed(SurfaceHolder holder)  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

표면이 파괴되기 직전에 호출된다. 이 메소드가 리턴된 후부터 표면이 유효하지 않으므로 더 이상 그리기를 해서는 안된다. 스레드에게 그리기를 즉시 종료하도록 신호를 보내야 한다.  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

void surfaceChanged(SurfaceHolder holder, int format, int width, int height)

표면의 색상이나 포맷이 변경되었을 때 호출된다. 최소한 한번은 호출되므로 이 메서드로 전달된 인수를 통해 표면의 크기를 초기화 한다.

 

- 표면을 관리하는 주체는 SurfaceHolder 객체이다. 이 객체를 통해 표면의 크기나 색상 등을 관리하며 표면으로 출력을 내 보낼수도 있다.

 

- getHolder() 홀더 구하기, addCallback() 홀더를 구한 후 제일 먼저 할 일은 표면의 변화를 통지 받기위한 콜백 객체를 등록하는 것이다. 콜백 객체를 등록해 놓으면 시스템은 표면의 변화가 발생할 때마다 콜백의 메서드를 호출한다.

 

- lockCanvas는 표면을 잠그고 표면에 대한 캔버스를 제공한다. 이후 뷰에 그리듯이 모든 출력 메서드를 다 사용할 수 있으며 이 때 출력은 화면으로 바로 나가지 않고 표면의 비트맵에 그려진다. unlockCanvasAndPost 메서드는 표면 비트맵에 그려진 그림을 화면으로 내보내며 비로소 사용자 눈에 출력된 내용이 보이게 된다.  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

 

6. MediaPlayer p.1264  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 오디오와 비디오를 모두 지원하며 다양한 소스의 미디어를 재생할 수 있다.

- MediaPlayer는 상태가 변경되거나 에러가 발생할 때 미리 등록된 콜백 메서드를 호출한다. 관심있는 사건에 대해 리스너를 등록해 놓으면 원하는 시점에 신호를 받을 수 있다.  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

void setOnErrorListener(~)  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

void setOnPreparedListener(~)

void setOnCompletionListener(~)

스트림을 끝까지 재생했을 때 호출되며 이 때 객체는 재생완료 상태이다.

void setOnBufferingUpdateListener(~)tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

스트리밍 시에 버퍼에 새로운 데이터가 들어왔을 때 호출된다.

void setOnSeekCompleteListener(~)  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

재생 위치 변경이 완료될 때 호출된다.

- 디폴트 생성자로 객체를 생성하고 setDataSource로 미디어를 준비시키고 prepare로 준비 상태를 알린다. 간단한 효과음의 경우에는 스트림만 여는 create로 준비상태를 만들면 간단하다. 그다음은 start메소드로 재생하고 release로 파괴한다.

 

7. MediaRecorder  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 안드로이드는 음성 녹음 및 영상 녹화를 위해 MediaRecoder 클래스를 제공한다. 사용하는 방법은 형제 클래스인 MediaPlayer와 거의 유사하다. 녹음을 하려면 RECORD_AUDIO, WRITE_EXTERNAL_STORAGE 퍼미션이 필요하다.  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

 

8. MediaStore  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 안드로이드 운영체제가 미디어를 DB로 관리하므로 멀티미디어 응용 프로그램은 미디어 DB를 통해 정보를 얻어야 한다.

- 미디어의 목록을 관리하는 클래스는 MediaStore 이되 이 클래스 자체는 몇가지 상수만 제공할 뿐이고 실제 관리 기능은 중첩된 내부 클래스가 담당한다. MediaStore는 문법적으로는 클래스이지만 자체적인 기능은 거의 없고 내부 클래스와 인터페이스를 담는 통에 불과하다.

 

9. MediaMetadataRetriever  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 미디어 파일로부터 프레임이나 메타 데이터를 얻기 위하여 사용되는 클래스  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

 

10. MediaScannerConnection  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- MediaStore에 없는 것이 발견되면 찾아서 전달하는 클래스   tompa 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

반응형

 

728x90

 

 

 

출처: http://gogorchg.tistory.com/entry/Android-Opengl-%EC%82%AC%EC%9A%A9-%EC%8B%9C-Antialiasing-%EC%9E%91%EC%9A%A9

1. 아래에 두 옵션을 먼저 넣어보세요.
   조금이나마 선이 부드럽게 바뀝니다.

gl.glEnable(GL10.GL_LINE_SMOOTH);
gl.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST); 


2. 만약 위와 같은 옵션을 줬어도 변함이 없는 경우
혹시, Texture에 Bitmap을 넣을 경우 Bitmap.createScaledBitmap이 함수를 사용하셨는지 확인해보세요.
 
Bitmap.createScaledBitmap(src, dstWidth, dstHeight, filter);

src : 원본 Bitmap
dstWidth : 변경할 가로 사이즈
dstHeight : 변경할 세로 사이즈
filter : Bitmap에 부드럽게 보여주기 위한 필터 매개 변수 입니다. (boolean) 

이 네번째 매개 변수를 true로 해보세요.
정말 뭔가 Texture 이미지에 깔끔함을 볼 수 있으실껍니다.

아마도 Opengl뿐만 아니라 Bitmap적용되는 곳에서는 다 사용되겠죠^^
참고하세요.

이건 제 경험으로 알게 된겁니다. ㅎ 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

 

출처: http://www.androidpub.com/1764647

 

 drawARGB 캔버스를 한가지 색으로 칠한다
 drawRGB 캔버스를 한가지 색으로 칠한다. 
 drawArc 사각형 경계 영역 내에서 두 각 사이의 호를 그린다.
 drawBitmap 캔버스에 비트맵을 그린다. 대상 크기를 지정하거나 변형을 위한 매트릭스를 이용하면 겉모습을 변경할 수 있다. 
 drawBitmapMesh 매시를 이용해 비트맵을 그린다. 매시는 매시 안에 있는 점을 이동함으로써 대상의 겉모습을 조작할 수 있다 
 drawCircle 주어진 점을 중심으로 지정된 반지름 크기의 원을 그린다. 
 drawLine 두 점 사이에 선(혹은 일련의 선)을 그린다. 
 drawOval 지정된 사각형을 경계로 하는 타원을 그린다. 
 drawPaint 캔버스 전체를 지정된 페인트로 칠한다. 
 drawPath 지정된 패스를 그린다. Path객체는 종종 그리기 기본요소 집합을 하나의 객체안에 담는데 이용한다. 
 drawPicture 지정된 사각형 안에 Picture객체를 그린다. 
 drawPosText 각 문자의 오프셋을 지정하는 텍스트 문자열을 그린다. 
 drawRect 사각형을 그린다. 
 drawRoundRect 둥근 모서리를 가진 사각형을 그린다. 
 drawText 캔버스 위에 텍스트 문자열을 그린다. 텍스트 폰트, 크기, 색상, 랜더링 속성은 모두 Paint객체에서 설정한다. 
 drawTextOnPath 지정된 패스를 따라 텍스트를 그린다. 
 drawVertices 일련의 정점들로 지정된 여러 삼각 패치를 그린다. 
 drawColor 캔버스를 한가지 색으로 칠한다. 

 

 

Paint 활용하기

paint클래스는 페인트브러쉬와 팔레트를 표현한다.

Paint객체를 수정해서 그릴때 이용되는 색상, 스타일, 폰트, 특수효과(투명,세이더,필터 등)를 제어할 수 있다.

 

.setColor() : 페인트 색상선택

.setStyle() : 객체의 윤곽, 일부을 채우고 등의 작업

.parseColor(): 해당 색상을 투명하게 처리

.setAlpha() : 불투명 처리

.setShader() : 솔리드 색상으로 칠해준다. 세이더의 가장 흔한 것으로 그레디언트로 채움은 것

 참고: ComposeShader, BitmapShader, GradientShader

.setMaskFilter(): 모서리에 알파채널변화로 효과주기. (BlueMaskFilter, EmbossMaskFilter)

.setColorfilter(): RGB채널 변화로 효과 주기(이것은 알파채널을 무시한다.)

 참고: ColorMatrixColorFilter, LightColorFilter, PorterDuffColorFilter

.setPathEffect(): 그리는 방법을 제어한다. 도형의 모서리 모양을 바꾸거나, 윤곽선을 제어한다.

 참고: CornerPathEffect, DashPathEffect, DiscretePathEffect, PathDashPathEffect, SumPathEffect, ComposePathEffect

.setXfermode(): 캔버스에 이미 그려진 것 위에 새로 칠하는 방법

 참고: AvoidXfermode, PixelXorfermode, PorterDuffXfermode

.setSubpixelText() : 그려지는 사선을 부드럽게 하기 위해 안티앨리어싱을 적용해 준다. (성능이 떨어뜨릴 수 있음)

.setAntiAlias() : 그려지는 사선을 부드럽게 하기 위해 안티앨리어싱을 적용해 준다. (성능이 떨어뜨릴 수 있음)

 

2D 그래피스를 위한 하드웨어 가속

- HW설정하기 : 2D 그래픽랜더링을 위해서 HW가속기를 사용하자. 

  myActivity.requestWindowFeature(Window.FATURE_OPENGL);

- 이 효과에 해당되지 않는 요소 존재한다. 특히 Path가 해당하지 않는다.

- invalidate()는 캔버스 랜더링을 새로 하도록 한다.00

 

캔버스 드로잉 베스트 프랙티스

- 하드웨어 가속을 고려해라 : 추천한다.

- 크기와 방향을 고려해라 : 뷰와 오버레이 만들때 해상도와 크기에 대한 고려를 해야 한다.

- 객체는 정적으로 한 번만 만들자 : 객체 생성 비용이 매우 비싸다. 페인트, 패스, 세이더는 한번 만들어서 계속 사용

- onDraw는 비싸다는 사실을 기억해라 : 캔버스를 다시 그리는 일을 최소화 한다. 아래 3가지가 팀이다.

- 캔버스 변환을 이용해라 :캔버스내의 엘리먼트를 수정하지 말고 캔버스를 변환하도록 하라.

- 애니메이션을 이용해라 : 뷰를 직접 그리기 보다는 미리 정의된 애니메이션을 이용해라

- 비트맵과 나인패치를 이용해라: 이미지 정적이용시 직접 그리기보다는 이것을 사용하라.

 

맵 오버레이에 생명력 불어넣기

- Skip합니다.

 

 

 

=======================

=======================

=======================

 

 

 

 

 

 

안녕하세요 선후 입니다^^

 

지금 만들고 있는 게임에서 PNG 파일을 Bitmap 객체로 만들고

 

canvas에 그리고 있는데요,

 

회전을 시키거나 키우면 너무 각져버리네요 ㅠㅠ

 

이걸 좀 완화 할 수 있는 방법이 없을까요?

 

예를 들자면 TEXT일 경우 "안티얼라이어싱"을 먹여서 부드러운 TEXT를 출력하는것과

 

같은 동작을 하는기능이 있는지 궁금합니다. ㅠㅠ

 

canvas.DrawRect(xxxxxx, PAINT())

에서 PAINT에 안티를 먹여도 TEXT처럼 되지는 않더라구요 ㅠㅠ

 

이 게시물을...



 

목록

엮인글 주소 : http://www.androidpub.com/index.php?document_srl=1764647&act=trackback&key=fd1

 

2011.09.25 11:43:06

동네가수

Paint에 DITHER_FLAG나 FILTER_BITMAP_FLAG를 먹여줘보세요

 

2011.09.26 03:33:14

선후

동네가수님 안녕하세요^^

가르쳐주신 방법으로 해보았지만.. 부드럽게 되지는 않네요 ㅠㅠ

 

2011.09.26 09:34:01

그냥가자

Paint.ANTI_ALIAS_FLAG 이것도 있습니다. 적용해보세요.

 

2011.09.26 14:48:51

선후

그냥가자님 안녕하세요^^

 

그것도 해보았지만 안되네요 ㅠㅠ..

 

drawRecta 같은것에는 적용되는것 같은데

 

drawBitmap에는 안되는것일까요 ㅠㅠ ㅇ

 

아무래도 제가 뭔가 잘못하고 있는것이길 바라면서 찾아보고 있네요 ㅠㅠ

 

 

 

=======================

=======================

=======================

 

 

 

 

 

관련링크

http://aroundck.tistory.com/207

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

반응형