1. 비트맵(Bitmap)이란?


비트맵(Bitmap)은 안드로이드에서 이미지를 표현하기 위해 사용되는 객체이다. 메모리에 만들어지는 모든 이미지는 비트맵 객체로 관리된다. 메모리에 로딩된 비트맵 객체를 통해서 이미지를 우리가 원하는대로 조작할 수도 있다.


코드를 통해서 비트맵을 메모리에 만들고 비트맵 위에 그림을 그려보자.


public class CustomViewImage extends View {

    private Bitmap mBitmap;
    private Canvas mCanvas;
    private Paint mPaint;

    public CustomViewImage(Context context) {
        super(context);
        mPaint = new Paint();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); // 비트맵 객체 생성
        mCanvas = new Canvas(); //캔버스 객체 생성
        mCanvas.setBitmap(mBitmap); //캔버스를 비트맵에 붙이기 -> 이후 캔버스에 그리는 그래픽은 모두 mBitap에 적용된다.

        mPaint.setColor(Color.RED);
        mCanvas.drawRect(100, 100, 200, 200, mPaint); //캔버스에 빨간 사각형 그리기
    }


    @Override
    protected void onDraw(Canvas canvas) {
        if(mBitmap!=null){
            canvas.drawBitmap(mBitmap, 0, 0, null);
        }
    }
}

onSizeChanged()가 호출될 때 이미 비트맵 객체를 메모리에 생성하고 캔버스를 달아서 그림을 그려준다. 이렇게 미리 정의된 비트맵 객체가 onDraw 메소드가 호출되면 화면에 표시될 뿐이다.

이렇게 메모리에 미리 그래픽을 그려놓고 뷰가 화면에 표시될 때 미리 그려진 그래픽을 표시하는 방법을 더블 버퍼링(Double Buffering) 이라고 부른다. 더블 버퍼링은 화면에 그래픽을 그리는 그래픽 연산을 미리 해놓는다. 따라서 더블 버퍼링을 사용하면 한꺼번에 화면에 많은 그래픽을 그려야 할 때 큰 힘을 발휘한다.

위 코드를 실행하면 화면에 빨간색 사각형이 하나 보일 것이다.


2. BitmapFactory 클래스


BitmapFactory 클래스는 비트맵 객체를 만들어주는 여러가지 유용한 메소드를 제공한다.

public static Bitmap decodeFile(String pathName) //파일 경로의 이미지 파일을 읽어 비트맵 객체로 리턴
public static Bitmap decodeResource(Resources res, int Id) // 리로스의 이미지 파일을 읽어 비트맵 객체로 리턴
public static Bitmap decodeByteArray(byte[] data, int offset, int length) // 바이트 배열의 이미지파일을 읽어 비트맵 객체로 리턴
public static Bitmap decodeStream(InputStream inStr) //입력 스트림의 이미지파일을 읽어 비트맵 객체로 리턴



decodeResource(0 메소드를 이용해서 /res/drawable 폴더에 있는 이미지를 비트맵으로 만들어 그려보자.


public class SampleImageView extends View {

    Bitmap image;
    Paint mPaint;

    public SampleImageView(Context context) {
        super(context);
        mPaint = new Paint();
    }

    @Override
    protected void onDraw(Canvas canvas) {

        /* 리소스 폴더의 이미지를 가져와서 비트맵 객체로 생성한 이후 캔버스에 그리기*/
        image = BitmapFactory.decodeResource(getResources(), R.drawable.face);
        if(image!=null){
            canvas.drawBitmap(image, 10, 10, mPaint); //(10, 10) 좌표에 비트맵 그리기

            Matrix matrix = new Matrix(); //매트릭스 객체 생성
            matrix.postTranslate(300, 10);//매트릭스 좌표 (300, 10)으로 설정
            canvas.drawBitmap(image, matrix, mPaint); //매트릭스 정보 이용해 그리기
        }

    }
}

위 코드에서 사용한 Matrix 객체는 이미지 변환을 해주는 클래스이다. Matrix 클래스는 이미지의 확대/축소, 이동, 회전 등의 많은 이미지 변환 메소드를 제공한다. 위 코드에서는 매트릭스를 이용해서 좌표를 설정하고 캔버스에 비트맵을 한 번 더 그려주었다.

위 코드를 실행하면 다음과 같은 화면을 볼 수 있다.

1

+ Recent posts