티스토리 뷰

Android/정리

Bitmap 객체

란텔 2016. 9. 21. 18:49

안드로이드에서 Bitmap 객체를 이용해 화면에 이미지를 나타낼 수 있다. 그리고 비트맵에는 그래픽을 그릴 수도 있다.


Bitmap을 사용할 때 더블버퍼링(새로운 비트맵을 만들고 비트맵에 그래픽이나 이미지를 다 그려놓은 다음 완성된 Bitmap을 마지막에 canvas에 그리고 뷰가 다시 그려져야 할 때 기존의 Bitmap을 화면에 표시하는 기법)방식을 사용한다.


Bitmap은 다음과 같이 createBitmap(...)메서드를 이용해 생성하고 Canvas에 셋팅한다.

1
2
3
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas();
canvas.setBitmap(bitmap);
cs

3번째 라인의 setBitmap이 빠진다면 해당 canvas에 drawRect같은 메서드를 사용하여 그래픽을 그리더라도 적용되지 않는다.



그런 다음에 생성한 Paint객체를 이용해서 설정을 하고, 원하는 Canvas객체의 그리기 메서드인 draw~(..)메서드를 이용해 그래픽을 그려준다. Paint의 생성은 권장사항은 아니다 null로 해줘도 된다.

1
2
3
canvas.drawColor(Color.BLACK);
paint.setColor(Color.WHITE);
canvas.drawRect(100100200200, paint);
cs

drawColor는 배경색이고, setColor는 그래픽 색 설정이다.



마지막으로는 View가 그려질 시기, 즉 onDraw메서드가 호출 될 때 파라미터로 들어오는 Canvas타입에 Bitmap을 그려야한다.

1
2
3
4
5
6
7
8
@Override
protected void onDraw(Canvas canvas) {
     super.onDraw(canvas);
     Log.i("OnDraw","enter");
     
     canvas.drawBitmap(bitmap, 00null);
    
}
cs

이렇게 하면 배경색이 검은색, 그래픽 색이 하얀색인 화면을 안드로이드 화면에서 볼 수 있다.






XML레이아웃 파일에서 <ImageView>를 이용하여 이미지를 보여 줄 수 있도록 할 수 있지만, 이미지 위에 선과 같은 그래픽을 같이 보여주는 등의 추가적인 작업을 할 수 없다.

이렇게 하기 위해서는 Bitmap을 이용해야 하며, BitmapFactory클래스를 이용하면 이미지나 파일을 읽어서 Bitmap객체로 만들어주는 메서드를 사용할 수 있으며, 이 메서드들은 static멤버로 정의되어 있다.


+ BitmapFactory의 대표적 메서드

 static Bitmap decodeFile(String path)

 파일의 경로를 지정하여 이미지 파일을 읽어온다.

 static Bitmap decodeResources(Resources res, int id) 

 리소스에 지정한 이미지 파일을 읽어온다.

 static Bitmap decodeByteArray(byte[] data, int offset, int length)

 바이트 배열로 된 이미지 파일을 읽어온다.

 static Bitmap decodeStream(InputStream in)

 입력 스트림에서 이미지 파일을 읽어온다.



위의 메서드에서 하나를 사용해본다.

1
2
3
Bitmap bitmapImage = BitmapFactory.decodeResource(getResources(), R.drawable.image2); //res에 저장된 이미지를 Bitmap형식으로 가져온다.
Bitmap resizeImgBitmap = Bitmap.createScaledBitmap(bitmapImage, 150300true); //사진이 클 경우, 다음과 같이 resize한다.
canvas.drawBitmap(resizeImgBitmap, 150150null); //캔버스의 적절한 위치에 그린다.
cs

위처럼 하면 Bitmap을 이용해 이미지를 화면에 보여줄 수 있으며, Bitmap위에 추가적인 그래픽을 그릴 수 있다.



Matrix타입을 이용하면 Bitmap의 확대/축소/반전(scale), 이동(translate), 회전(rotate) 등의 효과를 처리할 수 있다.

1
2
3
4
Matrix matrix = new Matrix();
matrix.setScale(-11); //좌우대칭 값 -1, 1
Bitmap scaleBitmap = Bitmap.createBitmap(resizeImgBitmap, 00, resizeImgBitmap.getWidth(), resizeImgBitmap.getHeight(), matrix, false);
canvas.drawBitmap(scaleBitmap, 350150null);
cs

위 코드는 Bitmap에 대하여 좌우 반전 효과를 주는 설정을 하고, Canvas에 그리고 있다.

setScale(-1, 1)을 주면 좌우 대칭, setScale(1, -1)을 주면 상하 대칭이다.



이미지에 여러가지 효과를 나타내기 위해서 Mask Filter를 사용한다. 그 중에 한가지인 BlurMaskFilter는 이미지에 번짐 효과를 낼 수 있으며 다음과 같이 사용할 수 있다.

Mask Filter는 Paint타입의 setMaskFilter(...)메서드를 사용해서 설정할 수 있다.

1
2
3
4
5
Paint effectPaint = new Paint();
effectPaint.setMaskFilter(new BlurMaskFilter(15,BlurMaskFilter.Blur.INNER));
Bitmap scaleBitmap1 = Bitmap.
createBitmap(resizeImgBitmap, 00, resizeImgBitmap.getWidth(), resizeImgBitmap.getHeight(), matrix, false);
iCanvas.drawBitmap(scaleBitmap1, 550150, effectPaint);
cs






+ 위에 나열한 기능들을 합쳐서 테스트 해본 전체 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
public class BitmapImageView extends View {
 
    Canvas iCanvas;
    Bitmap iBitmap;
    Paint iPaint;
 
    public BitmapImageView(Context context){
        super(context);
        iPaint = new Paint();
    }
 
    public BitmapImageView(Context context, AttributeSet attr){
        super(context, attr);
        iPaint = new Paint();
    }
  //View가 화면에 보이기 전에 이메서드가 먼저 실행 된다. (onDraw메서드보다 먼저 호출됨)
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        Log.i("OnSizeChanged","enter");
        createSetBitmap(w, h);
        drawing();
    }
 
    public void createSetBitmap(int w, int h){
        //새로운 비트맵을 생성하는 코드.
        //세번 째 파라미터는 다른 값으로 지정해도 되지만 ARGB_888로 하면 투명도를 조절 가능하다.
        Log.i("CreateCacheBitmap","enter");
        iBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        iCanvas = new Canvas();
        iCanvas.setBitmap(iBitmap);
    }
 
    public void drawing(){
        Log.i("Drawing","enter");
        iCanvas.drawColor(Color.BLACK);
        iPaint.setColor(Color.WHITE);
        iCanvas.drawRect(10108080, iPaint);
 
        //decodeResource를 이용해 이미지를 Bitmap으로 가져오기
        Bitmap bitmapImage = BitmapFactory.decodeResource(getResources(), R.drawable.image2);
        Bitmap resizeImgBitmap = Bitmap.createScaledBitmap(bitmapImage, 150300true);
        iCanvas.drawBitmap(resizeImgBitmap, 150150null);
 
        //Matrix객체를 사용하면 Bitmap이미지의
        Matrix matrix = new Matrix();
        matrix.setScale(-11); //좌우대칭 값 -1, 1
 
        Bitmap scaleBitmap = Bitmap.
                createBitmap(resizeImgBitmap, 00, resizeImgBitmap.getWidth(), resizeImgBitmap.getHeight(), matrix, false);
 
        iCanvas.drawBitmap(scaleBitmap, 350150null);
 
 
        Paint effectPaint = new Paint();
        effectPaint.setMaskFilter(new BlurMaskFilter(15,BlurMaskFilter.Blur.INNER));
        Bitmap scaleBitmap1 = Bitmap.
                createBitmap(resizeImgBitmap, 00, resizeImgBitmap.getWidth(), resizeImgBitmap.getHeight(), matrix, false);
        iCanvas.drawBitmap(scaleBitmap1, 550150, effectPaint);
 
        String path = Environment.getExternalStorageDirectory().getPath();
        //경로의 파일을 Bitmap으로 가져오기
        Bitmap bitmapFile = BitmapFactory.decodeFile(path+"/DCIM/Camera/20160624_200218.jpg");
        //사진이 크기 때문에 조절하여 재구성
        Bitmap resizeBitmap = Bitmap.createScaledBitmap(bitmapFile, 300400true);
        iCanvas.drawBitmap(resizeBitmap, 100550null);
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.i("OnDraw","enter");
        if(iBitmap != null){
            canvas.drawBitmap(iBitmap, 00null);
        }
    }
}
cs



+ 결과 화면


Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday