Win32 API에서 영상처리를 위해 이미지로부터 픽셀 배열 얻어오기

Mobile Programming/Windows Mobile 2010. 10. 25. 21:19

먼저 대단히 좋은 참고가 된 지식인 유저분과, 이 지식인을 찾기 위해 함께 고생해주신 우리 06학번 오빠한테 감사하다는 말씀을!
 http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=67833701&qb=aGJpdG1hcCDtlL3shYAg7Ja77Ja064K06riw&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=gKSisv331xCsscnLn1Vssv--272669&sid=TMVVR@dHxUwAAGI6EQQ


윈모는 아니지만, 모체가 되는 API에 대해 글 하나 올리려합니다 ㅋ

그동안 영상처리를 위해 픽셀을 받아오는 건 그냥 와인라벨하던 프로젝트의 솔루션 기본 파츠를 그냥 그대로 들고오던거라 어떻게 얻어오는지 전혀 몰랐습니다.

지능시스템을 위해서 영상처리가 필요했는데 , 역시 픽셀을 얻어오는 것이 선행되어야 합니다.
DDB(Device Dependent Bitmap)는 처리속도가 낮고 배열로 취급하기가 어려워
DIB 이미지에서 픽셀배열을 얻어오는편이 편하다고 합니다.

1차원 배열을 얻어오는 점이 아직 문제가 되긴 합니다만 , 
어쨋거나 DIB에서 픽셀배열을 얻어오는데 필요한 구조체는

1. DIBSECTION
2. RGBTRIPLE (여기에 RGB값이 들어있습니다)

입니다 .

#define HBYTES(w, b)  ((((w) * (b) + 31) & ~31) / 8)

	hBitmap = (HBITMAP)LoadImage(NULL, Path, IMAGE_BITMAP, 0, 0,
		LR_LOADFROMFILE | LR_CREATEDIBSECTION);
	DIBSECTION dib;

	GetObject(hBitmap, sizeof(DIBSECTION), &dib);

	DWORD cbHBytes = HBYTES(dib.dsBmih.biWidth, dib.dsBmih.biBitCount);//cbhbyte : 수평바이트수
	if(dib.dsBmih.biBitCount == 24) {//RGB데이터일때만
		int im_Height = dib.dsBmih.biHeight;
		//DIB는 Y좌표가 상위로 갈수록 +. 따라서 높이 - 정상좌표가 바뀐 역방향좌표.
		int p = (dib.dsBmih.biWidth * (im_Height-550)) + 270;			
		int x = p % dib.dsBmih.biWidth;
		int y = p / dib.dsBmih.biWidth;
		RGBTRIPLE* p1 = (RGBTRIPLE*)((LPBYTE)dib.dsBm.bmBits + y * cbHBytes) + x;
		p= p;
	}

DIB는 Y좌표가 상위로 갈수록 증가한다는 사실을 유의합니다.
먼저 얻어온 path에 따라서 이미지를 메모리에 로드하고, 그 핸들을 저장합니다.
그리고 핸들을 이용해서 DIBSECTION의 정보 초기화,
24비트(RGB , 8비트-255까지니까-씩.)일때만 p로 픽셀위치를 얻어오고 RGBTRIPLE을 이용해 그 RGB값을 얻어옵니다.

이를 응용해서 배열로 받아오는 함수를 작성하면,

RGB_Trip ** makeRGB(DIBSECTION dib,int * height, int * width){

	*height = dib.dsBmih.biHeight;
	*width = dib.dsBmih.biWidth;

	RGB_Trip ** RGBImage = new RGB_Trip*[*height];

	for(int i =0; i < *height; i++){
		RGBImage[i] = new RGB_Trip[*width];
	}

	DWORD cbHBytes = HBYTES(dib.dsBmih.biWidth, dib.dsBmih.biBitCount);//cbhbyte : 수평바이트수
	if(dib.dsBmih.biBitCount == 24) {//RGB데이터일때만
		int im_Height = dib.dsBmih.biHeight;
		//DIB는 Y좌표가 상위로 갈수록 +. 따라서 높이 - 정상좌표가 바뀐 역방향좌표.
		//int p = (dib.dsBmih.biWidth * (im_Height-550)) + 270;
		for(int i = 0; i < *height; i++){
			for(int j = 0; j < *width; j++){
				int p = dib.dsBmih.biWidth*(im_Height-i)+j;
				int x = p % dib.dsBmih.biWidth;
				int y = p / dib.dsBmih.biWidth;
				RGBTRIPLE* p1 = (RGBTRIPLE*)((LPBYTE)dib.dsBm.bmBits + y * cbHBytes) + x;
				RGBImage[i][j] = p1;
			}//j

		}

	}//if

	return RGBImage;

}

Android 개발 Tip - 3. Landscape layout

Mobile Programming/Android Tip 2010. 10. 19. 14:32

수평으로 단말기가 놓여졌을때 원하는 레이아웃을 따로지정할수있다.

이때는 반드시 res 폴더에 layout-land폴더를 만들고, 수평 xml파일과 같은 이름으로 지정해 만들어주어야 한다.

Android 입문자를 위한 Tutorial - 3. Layout

Mobile Programming/Android 2010. 9. 28. 17:21

저번 포스팅에서 LinearLayout이라는 생소한 단어를 봤죠.
자세한 설명을 배제하고 포스팅을 마쳤는데 ,
이번에 Layout에 관한 간단한 공부를 해봅시다.

Layout은 어느정도 짐작하고 계시겠지만 위젯(버튼,텍스트뷰,에디트박스 등등)등을 배치하는 큰 규칙입니다.

Layout은 총 5가지가 있습니다 .

1. Linear Layout
2. Relative Layout
3. Absolute Layout
4. Frame Layout
5. Table Layout



Absolute Layout은 절대좌표로 위치를 지정하는 레이아웃입니다.
그런데 이런 방식은 단말기의 기종에따라,, 해상도에따라 완전히 불안정하기 때문에 현재는 deprecated 선언되었습니다.
따라서 자세한 설명은 배제합니다!