티스토리 뷰
안드로이드에서 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(100, 100, 200, 200, 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, 0, 0, null); } | 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, 150, 300, true); //사진이 클 경우, 다음과 같이 resize한다. canvas.drawBitmap(resizeImgBitmap, 150, 150, null); //캔버스의 적절한 위치에 그린다. | cs |
위처럼 하면 Bitmap을 이용해 이미지를 화면에 보여줄 수 있으며, Bitmap위에 추가적인 그래픽을 그릴 수 있다.
Matrix타입을 이용하면 Bitmap의 확대/축소/반전(scale), 이동(translate), 회전(rotate) 등의 효과를 처리할 수 있다.
1 2 3 4 | Matrix matrix = new Matrix(); matrix.setScale(-1, 1); //좌우대칭 값 -1, 1 Bitmap scaleBitmap = Bitmap.createBitmap(resizeImgBitmap, 0, 0, resizeImgBitmap.getWidth(), resizeImgBitmap.getHeight(), matrix, false); canvas.drawBitmap(scaleBitmap, 350, 150, null); | 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, 0, 0, resizeImgBitmap.getWidth(), resizeImgBitmap.getHeight(), matrix, false); iCanvas.drawBitmap(scaleBitmap1, 550, 150, 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(10, 10, 80, 80, iPaint); //decodeResource를 이용해 이미지를 Bitmap으로 가져오기 Bitmap bitmapImage = BitmapFactory.decodeResource(getResources(), R.drawable.image2); Bitmap resizeImgBitmap = Bitmap.createScaledBitmap(bitmapImage, 150, 300, true); iCanvas.drawBitmap(resizeImgBitmap, 150, 150, null); //Matrix객체를 사용하면 Bitmap이미지의 Matrix matrix = new Matrix(); matrix.setScale(-1, 1); //좌우대칭 값 -1, 1 Bitmap scaleBitmap = Bitmap. createBitmap(resizeImgBitmap, 0, 0, resizeImgBitmap.getWidth(), resizeImgBitmap.getHeight(), matrix, false); iCanvas.drawBitmap(scaleBitmap, 350, 150, null); Paint effectPaint = new Paint(); effectPaint.setMaskFilter(new BlurMaskFilter(15,BlurMaskFilter.Blur.INNER)); Bitmap scaleBitmap1 = Bitmap. createBitmap(resizeImgBitmap, 0, 0, resizeImgBitmap.getWidth(), resizeImgBitmap.getHeight(), matrix, false); iCanvas.drawBitmap(scaleBitmap1, 550, 150, effectPaint); String path = Environment.getExternalStorageDirectory().getPath(); //경로의 파일을 Bitmap으로 가져오기 Bitmap bitmapFile = BitmapFactory.decodeFile(path+"/DCIM/Camera/20160624_200218.jpg"); //사진이 크기 때문에 조절하여 재구성 Bitmap resizeBitmap = Bitmap.createScaledBitmap(bitmapFile, 300, 400, true); iCanvas.drawBitmap(resizeBitmap, 100, 550, null); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Log.i("OnDraw","enter"); if(iBitmap != null){ canvas.drawBitmap(iBitmap, 0, 0, null); } } } | cs |
+ 결과 화면
'Android > 정리' 카테고리의 다른 글
타 액티비티 전환 또는 종료 애니메이션 효과 주기 (0) | 2016.10.07 |
---|---|
안드로이드 Thread 그리고 Handler (0) | 2016.09.25 |
그리기 객체 (0) | 2016.09.19 |
안드로이드에서 서블릿을 호출하여 MySQL 질의 결과 가져오기 (0) | 2016.09.08 |
리스트 뷰 (ListView) (0) | 2016.09.07 |