C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[57303] Re:안녕하세요. 빌더 초보의 질문입니다.
김시환 [godson2] 1102 읽음    2009-06-18 14:52
TImage  컴포넌트의 Pixels  라는 속성값을 읽어오면 RGB를 추출할 수 있습니다.

Image->Picture->Bitmap->Canvas->Pixels[X][Y] ;

Pixels 는 TColor 값을 추출해 줍니다.

TColor 은 32bit 정수값과 같은 값으로 정의가 가능합니다.
따라서 0x00000000 ~ 0xffffffff 값으로 표현이 가능합니다. 이중에서 상위 8비트는 사용을 하지 않고

다음 8비트 단위로 Blue, Green, Red 의 순으로 값을 가지고 있습니다.

따라서
0x00 ff 00 00   <-  Blue
0x00 00 ff 00   <-  Green
0x00 00 00 ff   <- Red
이렇게 표현이 됩니다.   따라서 이 상위 8비트를 제외한 나머지 24비트로서 색상을 표현하는 것입니다. 

따라서 각각의 RGB를 추출하려면

unsigned char R,G,B ;
TColor color ;

color = Image->Picture->Bitmap->Canvas->Pixels[X][Y] ;

R = color & 0xff ;
G = (color>>8) & 0xff ;
B = (color>>16) & 0xff

이렇게 하면 되겠네요..

그런데 질문의 내용이 이미지를 비교하는 내용인것 같으므로 굳이 RGB를 각각 나눌 필요성 보다는
2차원 정수 배열을 만들어서 선택한 영역을 정수 배열에 저장하고
비교할 때는 Pixels 값만 읽어와서 정수 위치와 비교하는 것이 좋을듯 합니다.








JS 님이 쓰신 글 :
: 안녕하세요, 회원가입하고 눈팅만 해온지 꽤 된 빌더 초짜입니다.
: 거의 매일 포럼에 들어와서 여러가지 정보를 캐치해 가며 공부를 하고 있습니다.
: 물론 바이블 도 틈틈히 보면서, 포럼과 책의 내용도 비교해가면서 제 것으로 만들어 가고 있는중입니다.
: 그래서 항상 감사해 하고 있습니다.
:
: 프로그래밍을 하다가, 어떤 부분에서 막혀서 더이상 진행이 불가능하네요.
: 제가 하려는 프로그래밍의 대략적인 진행순서는,
: 폼에 이미지(사진)로드 -> 마우스 이벤트(Down, Up, Move)로 범위 지정(드래깅을 사용했어요.) -> 범위지정한
: 부분의 RGB 추출 -> 폼의 이미지(사진)의 모든 부분과 매치 -> 범위지정한 부분과 같은부분(x축, y축의 길이는 같다.)
: 이 있다면 -> 렉텡글 박스로 표시.
:
: 이정도 입니다. 폼에 이미지 로드 하고 마우스 이벤트로 범위 지정은 했습니다 // 기초부분.
:
: 단, 범위지정은 MouseDown일때의 픽셀값과, MouseUp일때의 픽셀값을 구해서, Rectangle로 그렸습니다.
: -->물론 이렇게 한건 그냥 Rect를 그린것이지 범위 지정한 부분은 아니라고 생각합니다만, 픽셀값을 얻어냈으므로,
: 연산을 통해 구할 수 있다고 생각합니다.(ex: MouseUp좌표 - MouseDown좌표)
:
: 질문 1)
: <-- 더 좋은 방법이 있다면, 조언과 설명 부탁드릴게요.
:
: 참으로 오랫동안 그리고 여러번 RGB에 관하여 검색을 해봤습니다. 책도 찾아가며 공부를 해봤습니다만,
: RGB를 추출하는 법을 모르겠습니다. (FAQ에 나와있는 방법을 해봤습니다만, MouseUp이벤트가 발생할때
: 로 적용을 하지 못하겠습니다.) 그리고 DirectShow를 사용 하면 훨씬 간편하다라는 글을 여러번 봤습니다만,
: 이 프로그래밍을 완성하고 난 후부터 사용 할 것입니다. 원리를 알아야 한다는 생각에..
:
: 질문 2)
: <-- MouseMove 이벤트로 Rect를 그렸습니다. Rect안에 있는 한개의 픽셀의 RGB 추출하는 방법만
: 알아도 모두 구할수 있을 것 입니다. RGB 추출하는 방법을 가르쳐 주세요.
:
: Rect 범위 안에 있는 그림은 폼의 이미지(로드한 이미지)의 모든 부분과 매치를 시켜서 같은 부분을 찾습니다.
: 제가 생각한 알고리즘은 Rect 범위 안에 있는 픽셀들의 RGB 값을 배열에 저장해서,  저장된 배열과 같은 배열을
: 검색하는 것입니다. 단, 시간이 매우 오래 걸릴것 같은 느낌은 듭니다...
:
: 질문 3) 제가 생각한 알고리즘의 문제점이나, 기타 더 좋은 방법 있다면, 조언과 설명 부탁드리겠습니다.
:
: 질문은 여기까지 입니다.
:
: 사실 여기에 질문을 올리게 된 건, 다 RGB 때문이네요. 좀더 머리 아프며 고민해 보려고했지만,
: 토할것 같아서 머리를 잠시 식히려고 합니다. 그래도 아침이면 다시 프로그래밍을 하고 있겠죠.
:
: 답변이 달릴지는 모르겠으나, 답변을 해주신다면 정말, 대단히 감사드리겠습니다.
: 또, 절대로 고민해보고, 검색해보고, 공부해보고 올리는 질문이니 날로 먹으려고 한다는 생각은 하지 말아주세요.
:
: - 수정 : 어제 많이 정신이 없었나보네요. 델파이 포럼에다가 글을 올렸었군요.. 삭제하고, 다시 씁니다 -

+ -

관련 글 리스트
57298 안녕하세요. 빌더 초보의 질문입니다. JS 957 2009/06/18
57303     Re:안녕하세요. 빌더 초보의 질문입니다. 김시환 1102 2009/06/18
57318         Re:Re:안녕하세요. 빌더 초보의 질문입니다. JS 1007 2009/06/19
57301     Re:안녕하세요. 빌더 초보의 질문입니다. 김동욱 928 2009/06/18
57319         Re:Re:안녕하세요. 빌더 초보의 질문입니다. JS 966 2009/06/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.