본문 바로가기

안드로이드

BtimapFactory 클래스

반응형

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 is)
입력 스트림에서 이미지 파일을 읽어온다

 

바이트 배열이나 스트림에서 읽을 수 있다는 것은 원격지에 있는 이미지 파일도 손쉽게 읽어 들일 수 있다는 것을 의미한다

원격지의 소켓 서버나 웹 서버에 있는 이미지 파일은 서버에 연결한 후 입력 스트림으로 이미지를 읽어 들이거나 바이트 배열의 형태로 읽어 들인 데이터를 decodeByteArray 메소드를 이용해서 이미지로 변환할 수 있다

 

 

CustomViewImage.java

package com.example.a68_sample_customviewimage;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class CustomViewImage extends View {
    private Bitmap cacheBitmap;
    private Canvas cacheCanvas;
    private Paint mPaint;

    public CustomViewImage(Context context) {
        super(context);

        init(context);
    }

    public CustomViewImage(Context context, AttributeSet attrs) {
        super(context, attrs);

        init(context);
    }

    private void init(Context context) {
        mPaint = new Paint();
    }

    //    뷰가 화면에 보이기 전에 Bitmap 객체 만들고 그 위에 그리기
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        createCacheBitmap(w, h);
        testDrawing();
    }

    //    메모리에 Bitmap 객체를 만들고 Canvas 객체 설정
    private void createCacheBitmap(int w, int h) {
        cacheBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        cacheCanvas = new Canvas();
        cacheCanvas.setBitmap(cacheBitmap);
    }

    //    빨간 사각형 그리기
    private void testDrawing() {
        cacheCanvas.drawColor(Color.WHITE);
        mPaint.setColor(Color.RED);
        cacheCanvas.drawRect(100, 100, 200, 200, mPaint);

//        리소스의 이미지 파일을 읽어 들여 화면에 그리기
        Bitmap srcImg = BitmapFactory.decodeResource(getResources(), R.drawable.waterdrop);
        cacheCanvas.drawBitmap(srcImg, 30, 30, mPaint);

//        android.graphics의 Matrix 임포트
//        매트릭스 객체를 이용해 좌우 대칭이 되는 비트맵 이미지를 만들어 그리기
//        이미지를 다른 형태로 바꾸는 과정인 이미지 변환(Transformation)이 안드로이에서는 Matrix 클래스가 사용된다
//        Matrix 객체를 이용하면 확대/축소, 이동, 회전, 뒤틀림 등의 효과를 간단하게 처리 가능하다
        Matrix horInverseMatrix = new Matrix();
        horInverseMatrix.setScale(-1, 1);
        Bitmap horInverseImg = Bitmap.createBitmap(srcImg, 0, 0, srcImg.getWidth(), srcImg.getHeight(), horInverseMatrix, false);
        cacheCanvas.drawBitmap(horInverseImg, 30, 130, mPaint);

//        매트릭스 객체를 이용해 상하 대칭이 되는 비트맵 이미지를 만들어 그리기
        Matrix verInverseMatrix = new Matrix();
        verInverseMatrix.setScale(1, -1);
        Bitmap verInverseImg = Bitmap.createBitmap(srcImg, 0, 0, srcImg.getWidth(), srcImg.getHeight(), verInverseMatrix, false);
        cacheCanvas.drawBitmap(verInverseImg, 30, 230, mPaint);

//        이미지에 다양한 효과를 내는 데는 마스크를 이용하기도 ㅎㄴ다
//        BlurMaskFilter는 번짐 효과를 낼 수 있는 마스크 필터로, 페인트 객체에 설정하여 사용할 수 있다
//        비트맵 이미지를 확대할 때는 createScaledBitmap 메소드를 사용할 수 있다
        mPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL));
        Bitmap scaledImg = Bitmap.createScaledBitmap(srcImg, srcImg.getWidth() * 3, srcImg.getHeight() * 3, false);
        cacheCanvas.drawBitmap(scaledImg, 30, 300, mPaint);


    }

    //    메모리의 Bitmap을 이용해 화면에 그리기
    @Override
    protected void onDraw(Canvas canvas) {
        if (cacheBitmap != null) {
            canvas.drawBitmap(cacheBitmap, 0, 0, null);
        }
    }
}

 

 

MainActivity

package com.example.a68_sample_customviewimage;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);

        CustomViewImage customViewImage = new CustomViewImage(this);

        setContentView(customViewImage);
    }
}

 

반응형

'안드로이드' 카테고리의 다른 글

멀티터치 이미지 뷰어 만들기  (0) 2021.11.03
페인트보드(그림판) 만들기  (0) 2021.11.02
비트맵 이미지 사용  (0) 2021.11.02
드로어블 객체로 만들어 그리기  (0) 2021.11.02
뷰에 그래픽 그리기  (0) 2021.11.01