Please Enable JavaScript!
Gon[ Enable JavaScript ]

안드로이드(Android) 비트맵의 픽셀값을 읽어와 화면에 그리기

안드로이드 개발
반응형

안드로이드(Android) 비트맵의 픽셀값을 읽어와 화면에 그리기 


이번 예제는 ImageView 레이아웃에 비트맵을 그리는 것이 아니라 Canvas 에 그린다.

그리고 새로운 픽셀값 저장을 위한 메모리 공간을 만들고 거기에 읽어들인 Bitmap

픽셀값을 넣는다. 복사한 픽셀값으로 비트맵을 만들어 보여주는것이다.

이 과정은 createColors 에서 수행되는데 처음 로딩될 때 읽어들인 비트맵의

픽셀값을 하나하나씩 읽어들인다.


// 픽셀값  넣을 배열을 만들고 읽어온 이미지 픽셀값을 넣는다  
int[] colors = new int[mST * mHeight];
for (int y = 0; y < mHeight; y++) {
	for (int x = 0; x < mWidth; x++) {
		colors[y * mST + x] = mBitmap.getPixel(x, y);
		Log.d("BitmapView","X="+x+",Y="+y);
	}
}

위 소스는 전체 비트맵을 읽어들여 사용하기 때문에 시간이 오래걸리고 비효율적이다.

특정 위치의 비트맵에 대한 정보를 가져오기 위해 유용하다. 그럼 전체 비트맵을

리턴받은 픽셀값이 저장된 배열 int[] colors Bitmap.createBitmap 파라미터로 넘겨

다시 비트맵을 생성한다.


mBitmaps
[0] = Bitmap.createBitmap(

                 colors, 0, mST, mWidth, mHeight, Bitmap.Config.ARGB_8888);

전체 소스는 다음과 같다

 

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;

public class Main extends Activity {

	private Bitmap mBitmap;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.helicopter_medical);
	        setContentView(new BitmapView(this));
    }
    
    public class BitmapView extends View{
    	private Bitmap mViewBitmap;
    	private int[] mColors;
    	private Paint mPaint;
    	private int mWidth = 0;
    	private int mHeight = 0;
    	private int mST = 0;
		
    	public BitmapView(Context context){
    		super(context);
    		setFocusable(true);

    		mColors = createColors();
    		int[] colors = mColors;

    		mViewBitmap = Bitmap.createBitmap(colors, 0, mST, mWidth, mHeight, Bitmap.Config.ARGB_8888);
    		mPaint = new Paint();
    		mPaint.setDither(true);
    	}
	@Override
	protected void onDraw(Canvas canvas) {
		int winWidth = getWidth();
    		int winHeight = getHeight();
		// 이미지 그리기
		canvas.drawColor(Color.WHITE);
		canvas.drawBitmap(mViewBitmap, winWidth / 2 - mWidth, winHeight / 2 - mHeight, null);
		canvas.translate(0, mViewBitmap.getHeight());
		
		super.onDraw(canvas);
	}
	
	private int[] createColors(){
		int[] colors = null;
		mWidth = mBitmap.getWidth();
		mHeight = mBitmap.getHeight();
		mST = mWidth + 10; // 넓이보다 10을 크게 설정
	
		colors = new int[mST * mHeight];
		for (int y = 0; y < mHeight; y++) {
			for (int x = 0; x < mWidth; x++) {
				colors[y * mST + x] = mBitmap.getPixel(x, y);
			}
		}
			
		return colors;
	}
    }
}

비트맵을 읽어들이는 또 다른 방법 - 2

 

이것은 픽셀값만 저장된 데이터로 비트맵을 생성하는 예를 보여준것이며 영상처리

프로그램할 때 쓰일 만한 예제인것같다. 하지만 위의 방법은 이미지를 분석하거나

특정픽셀값을 변경하여 이미지에 특별한 효과를 주는등의 작업만 가능하다. 왜냐하면

전체 이미지의 픽셀을 읽어들여 새로 만든 메모리에 집어넣는 과정이 오래걸리기

때문에 비 효율적이다. 그래서 Bitmap 클래스에서는 getPixels 라는 함수를 제공한다.

for 문을 돌려 하나하나씩 집어넣지 않고 픽셀값 저장할 메모리 객체를 파라미터로 넘기면된다

 

비트맵을 읽어서 픽셀값을 저장하는 곳이다. 미리생성한 colors getPixels 의 파라미터로 넘긴다

위의 예제처럼 번거롭게 for문을 돌려 일일이 집어넣지 않아도 된다.

colors = new int[mWidth * mHeight];
mBitmap.getPixels(colors, 0, mWidth, 0, 0, mWidth, mHeight);

읽어온 픽셀값을 다시 셋팅하고 화면에 그린다. 여기서 이미지 확대/축소, 픽셀값을 조절하여

영상처리등을 할수 있을 것이다.

Bitmap mViewBitmap;
int[] colors = createColors();
mViewBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
mViewBitmap.setPixels(colors, 0, mWidth, 0, 0, mWidth, mHeight);
전체소스는 다음과 같다

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.Window;

public class Main extends Activity {

	private Bitmap mBitmap;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.helicopter_medical);
        setContentView(new BitmapView(this));
    }
    
    public class BitmapView extends View{
    	private Bitmap mViewBitmap;
    	private int mWidth = 0;
    	private int mHeight = 0;
		
    	public BitmapView(Context context){
    		super(context);
    		setFocusable(true);

    		int[] colors = createColors();
    		// 픽셀작업
    		
    		// 이미지 그리기 
    		mViewBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
    		mViewBitmap.setPixels(colors, 0, mWidth, 0, 0, mWidth, mHeight);
    	}
		@Override
		protected void onDraw(Canvas canvas) {
			int winWidth = getWidth();
    		int winHeight = getHeight();
			// 이미지 그리기
			canvas.drawColor(Color.WHITE);
			canvas.drawBitmap(mViewBitmap, winWidth / 2 - mWidth, winHeight / 2 - mHeight, null);
			canvas.translate(0, mViewBitmap.getHeight());
			super.onDraw(canvas);
		}
		
		private int[] createColors(){
			// 픽셀값  넣을 배열을 만들고 읽어온 이미지 픽셀값을 넣는다  
			int[] colors = null;
			mWidth = mBitmap.getWidth();
			mHeight = mBitmap.getHeight();
								
			colors = new int[mWidth * mHeight];
			mBitmap.getPixels(colors, 0, mWidth, 0, 0, mWidth, mHeight);
			return colors;
		}
    }
}
반응형
Posted by 녹두장군1
,