달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
728x90
반응형

안드로이드 - 이미지 개념(Drawable, Bitmap, Canvas)

Android/일반 2011/08/29 19:05

안드로이드에서 이미지에 대한 개념은 다음과 같다.


1. Drawable
- 기본적으로 resource에 저장되어 있는 이미지의 경우 Drawable이라는 Object를 생성하여
화면에 그릴 수 있다.
1
2
3
4
5
6
7
8
9
Drawable drawable = getResources().getDrawable(id);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
// (int left, int top, int right, int bottom)
또는 drawable.setBounds(Rect rect);
@Override
onDraw(Canvas canvas){
drawable.draw(canvas);
}



2. Bitmap
- 임의의 Bitmap을 생성하고 Bitmap에 원하는 내용을 그릴 수 있다.
- 이렇게 만들어진 Bitmap에 직접 그림을 그리거나 다른 이미지를 그릴려고 하면 새로운 Canvas를 만들어야한다.
그러면 향후에 canvas에 그리는 모든 작업은 Bitmap에 반영이 된다.
1
2
3
4
5
Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
// Config.ARGB_8888(투명값 지정 가능) 말고 Config.RGB_565도 있다.
Canvas canvas = new canvas();
canvas.setBitmap(bitmap);



3. Bitmap과 Drawable간의 변환
- 안드로이드에서는 Bitmap을 직접 다루기보단 대부분 Drawable이라는 wrapping된 형태로 이미지를 처리하기 때문에
Bitmap의 경우 종종 Drawable로 변환해야 하는 경우가 있다. 이를 위해서 BitmapDrawable이라는 클래스가 존재한다.
1
Drawable drawable = (Drawable)(new BitmapDrawable(bitmap));



4. Canvas 처리
w*h 크기의 drawable 오브젝트가 있을 때 setBounds를 이용하여 임의의 좌표(x,y)에 원래 크기대로 출력하려면 아래와 같다.
1
2
obj.setBounds(x, y, x+w, y+h);
obj.draw(canvas);

그러나 이 방식의 귀찮은 점은 항상 w,h를 지정을 해줘야하기 때문에 코드가 상당히 길어지고 지저분해 보이는 경우가 많다.
(getIntrinsicWidth()/Height()로 항상 구하던지 별도의 변수에 값을 유지해야 한다.)

그래서 위와 같은 방법보다 아래와 같이 canvas의 좌표이동변환식을 이용하는게 깔끔하다.
1
2
3
4
5
6
7
8
obj.setBounds(0, 0, w, h); // drawable을 최초로 생성했을때 한 번만 지정하면 됨
canvas.save(); // 현재 변환식을 저장
canvas.translate(x, y); // 좌표이동과 관련된 변환식 적용
...
obj.draw(canvas); // drawable을 그린다.
...
canvas.restore(); // 원래 변환식으로 복구

Canvas 클래스의 메소드들 ::
http://blog.naver.com/PostView.nhn?blogId=foxmann&logNo=90095169727&categoryNo=0&parentCategoryNo=11&viewDate=&currentPage=1&postListTopCurrentPage=1&isAfterWrite=true


출처 ::
http://sdw8001.tistory.com/entry/Android-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EA%B0%9C%EB%85%90-CanvasBitmapDrawable

 

 

728x90
반응형
:
Posted by mapagilove