검색결과 리스트
글
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§ion=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; }