Q&A
HOME
Tips & Tech
Q&A
Discuss
Download
자유게시판
홍보 / 광고
구인 / 구직
LOGIN
회원가입
bmp 파일에서 컬러값 추출할때..
음..bmp 파일에서 컬러값을 추출하려고 합니다.
pixel이라는 메소드를 사용하는데요..
추출한 컬러값이 24비트 컬러값이 나오는데
그 그림이 원래 8비트(256컬러)인데도 불구하고 24비트 값이 나옵니다.
컴포넌트나 아니면 다른 방법으로 원 컬러값(8비트)으로
출력하는 방법없습니까?
1
COMMENTS
없음
•
2000.08.09 11:04
하진일 wrote:
> 음..bmp 파일에서 컬러값을 추출하려고 합니다.
>
> pixel이라는 메소드를 사용하는데요..
>
> 추출한 컬러값이 24비트 컬러값이 나오는데
>
> 그 그림이 원래 8비트(256컬러)인데도 불구하고 24비트 값이 나옵니다.
>
> 컴포넌트나 아니면 다른 방법으로 원 컬러값(8비트)으로
>
> 출력하는 방법없습니까?
>
음. 아마도 그림을 이미지 컴포넌트에다가 불러 놓고
color=Image1.Canvas.Pixel[x,y];
이런 식으로 색을 추출하셨다고 하는 것 같은데..... 글쎄요. 그런 식으로 과연 원
래의 컬러값을 읽어드릴 수 있을지 의문스럽군요. 사실 저도 그 쪽에 대해서 아는
게 별로 없는지라....
문제는 bmp 파일의 형식입니다. 만약 걔가 256컬러라면 일반 트루 컬러와는
형식이 다르거든요. bmp 파일 중 각 점들의 정보가 저장되어 있는 곳에 트루 컬러는
3바이트로 rgb값을 나타내는 것이 직접 들어가게 됩니다. 하지만 256컬러같은 경우
는 rgb quad에 있는 팔레트 인덱스 값이 그 곳에 들어갑니다. 그렇기 때문에 실제
색을 알려면 그 인덱스에 해당하는 팔레트의 rgb값들을 읽어와야 하죠. 좀 더 자세하
게 설명을 하죠. 지금의 경우는 256 컬러 bmp 파일의 경우를 말씀드리는 것입니다.
일단 헤더 부분은 건너 뛰고, 팔레트 있는 곳으로 가면 거기에는 아마 이렇게 되어
있을 것입니다. 정확한 명칭은 사용하지 않겠습니다(저도 잘 모르니까)
bmiColors[0].rgbRed=0;
bmiColors[0].rgbGreen=0;
bmiColors[0].rgbBlue=0;
bmiColors[1].rgbRed=0;
bmiColors[1].rgbGreen=0;
bmiColors[1].rgbBlue=51;
bmiColors[2].rgbRed=0;
bmiColors[2].rgbGreen=0;
bmiColors[2].rgbBlue=102;
:
:
bmiColors[254].rgbRed=255;
bmiColors[254].rgbGreen=255;
bmiColors[254].rgbBlue=204;
bmiColors[255].rgbRed=255;
bmiColors[255].rgbGreen=255;
bmiColors[255].rgbBlue=255;
그리고 실제 각 점들이 저장되는 곳은
01 0A FA DD 7C 9E ......
이렇게 되 있습니다. 그러면 첫 번째 점은 01이니까 저 위에 RGB값이 (0,0,51)인 색
을 나타내게 되죠. 두 번째 것은 10이니까 저 위에 긴 배열 중에 인덱스가 10인 곳
의 RGB 값을 나타내게 되죠. 저 뒤의 숫자들(0,0,0, 255, 51같은 것들)은 제가 임의
로 쓴 것이지, 사실 파일마다 다르게 되어 있습니다. 저게 바로 팔레트 엔트리라는
것이죠. 그러니 실제 저 값을 알려면 상당한 수고가 뒤따릅니다. 굳이 설명을 하자면
우선 BMP 파일의 헤더를 읽어서 BITMAPFILEHEADER와 BITMAPINFOHEADER부분을 건너 뛰
고 실제 점들이 저장되는 곳을 쭉 읽은 다음 다시 API를 써서 GetPaletteEntries로
각 엔트리에 어떤 RGB 값이 있는 지 파악을 한 다음 그것을 조금 전 읽은 값들에
대입하면 되겠죠. 그러니까 위의 얘로 설명을 하자면 일단 01 0A FA DD 7C
9E ......부분을 읽고, 그 다음 그 위에 긴 부분 있죠, 그 배열 쭉 나가는 데, 그
부분을 읽어서 01이니 하는 값들을 저 배열 요소에 집어 넣어서 rgb값을 뽑아내는
겁니다. 이렇게 하기, 장난이 아니겠죠! 하지만 사실 이 문제는 이렇게 하지 않고
도 할 수 있죠.
그리고 궁금한 것이 있는데, 님께서 어떻게 그 값이 24비트 컬러라고 생각하시는
지요....
color=Image1.Canvas.Pixel[x,y];
이렇게 했다면 그냥 저 팔레트 엔트리에 있는 값들이 제대로 뿌려졌을 테니까 제대
로 값이 나올 겁니다. 님께서 저 값이 00ffffff뭐 이런 식으로 살벌하게 나와서
아마 24비트가 아닌가 생각하신 것 같은데, 사실 256컬러도 rgb값으로 표현하기는
마찬가지니까 저렇게 나올 수밖에 없죠. 그러니까 이 값에서 r, g, b 값을 따로
떼어 내실려면
r=GetRValue(color);
g=GetGValue(color);
b=GetBValue(color);
하시면 됩니다. 아마 이러면 256컬러의 rgb값이 ,즉 팔레트 엔트리에 있는 값이
정확하게 나올 겁니다.
0
0
삭제
수정
댓글
(NOTICE) You must be
logged in
to comment on this post.
해운조합
2000.08.09 08:53
0
COMMENTS
/
0
LIKES
델파이 가능자 구함
Ghost
2000.08.09 08:48
0
COMMENTS
/
0
LIKES
이미지 경로 필드에 해당하는 이미지를 서버에서 어떻게 불러옵니까?
김동형
•
2000.08.09 08:35
1
COMMENTS
/
0
LIKES
API함수레 대해 알고 시푼데여..
없음
•
2000.08.09 10:31
김동형 wrote: > 움..책을 버고 공부하다보니깐..API함수라는걸
델파이 초보입문...
2000.08.09 08:23
0
COMMENTS
/
0
LIKES
quick report그룹밴드사용법
허춘
2000.08.09 08:11
0
COMMENTS
/
0
LIKES
Re: 퀵리포트 (선별하여 출력하기..좀 도와주세요..부탁)
난초보
2000.08.09 07:25
0
COMMENTS
/
0
LIKES
F1BOOK에서 콤보박스를 넣고싶어요.
이창영
•
2000.08.09 06:41
1
COMMENTS
/
0
LIKES
mdb 네트웍에서의 속도문제 어찌 방법이 없을런지?
타락천사
•
2000.08.09 22:12
안녕하세여.. 타락임다..^^ 혹쉬.. 쿼리 조건문의 필드가 인덱스 필드가 아닌게 아닐까여? 아님 함수...
이창영
2000.08.09 06:39
0
COMMENTS
/
0
LIKES
mdb에서 빈문자열 쿼리문은?
최용일
2000.08.09 06:30
0
COMMENTS
/
0
LIKES
Re: checklistbox의 각각의 item에 색깔을 넣을수 있는 방법은 ?
이문환
•
2000.08.09 06:24
6
COMMENTS
/
0
LIKES
splash 화면이 느리게 뜨기...
이문환
•
2000.08.09 23:07
이문환 wrote: > 스플레쉬 화면이 뜨기도 전에 메인화면이 뜹니다. > 저는 MDI 폼을 만들어서 그런지 스...
심동훈
•
2000.08.09 19:25
이문환 wrote: > 스플레쉬 화면이 뜨기도 전에 메인화면이 뜹니다. > 저는 MDI 폼을 만들어서 그런지 스...
강호규
•
2000.08.09 07:45
이문환 wrote: > 스플레쉬 화면이 뜨기도 전에 메인화면이 뜹니다. > 저는 MDI 폼을 만들어서 그런지 스...
이문환
•
2000.11.15 00:52
강호규 wrote: > 이문환 wrote: > > 스플레쉬 화면이 뜨기도 전에 메인화면이 뜹니다. > > 저는 MDI 폼...
강호규
•
2000.11.15 02:27
이문환 wrote: > 강호규 wrote: > > 이문환 wrote: > > > 스플레쉬 화면이 뜨기도 전에 메인화면이 뜹니...
유수정
•
2000.08.09 20:39
강호규 wrote: > 이문환 wrote: > > 스플레쉬 화면이 뜨기도 전에 메인화면이 뜹니다. > > 저는 MDI 폼...
궁금한 이
•
2000.08.09 05:21
1
COMMENTS
/
0
LIKES
요게 무슨 에레레여....
강호규
•
2000.08.09 07:47
궁금한 이 wrote: > 죄송합니다. 이런것 까지 여기에 부탁을 하게 되어서.. > 영어가 좀 딸리는 관계로.....
한비광
•
2000.08.09 05:21
2
COMMENTS
/
0
LIKES
델파이의 이벤트 문제
최용일
•
2000.08.09 05:39
안녕하세요. 최용일입니다. 프라퍼티에디터에서 이벤트탭에 보시면 여러 이벤트들이 있습니다. OnClick,...
한비광
•
2000.08.09 08:05
앗 있군요!! 감사 합니다 ㅠㅠ 최용일 wrote: > 안녕하세요. 최용일입니다. > > 프라퍼티에디...
하진일
•
2000.08.09 05:20
1
COMMENTS
/
0
LIKES
bmp 파일에서 컬러값 추출할때..
음..bmp 파일에서 컬러값을 추출하려고 합니다. pixel이라는 메소드를 사용하는데요.. 추출한 컬러값이 24비트 컬러값이 나오는데 그 그림이 원래 8비트(256컬러)인데도 불구하고 24비트 값이 나옵니다. 컴포넌트나 아니면 다른 방법으로 ...
없음
•
2000.08.09 11:04
하진일 wrote: > 음..bmp 파일에서 컬러값을 추출하려고 합니다. > > pixel이라는 메소드를 사용하는데...
한영수
•
2000.08.09 05:20
3
COMMENTS
/
0
LIKES
고수님의 도움이 절대 필요합니다!!!!!!!!!!(어찌 하오리까?)
hugehead
•
2000.08.09 22:33
Lock 관련되서 에러가 발생한다고 생각하거나, 또는 여러대의 PC가 동시에 작업할 때 문제가 되는 것 같다...
한영수
•
2000.08.10 03:08
hugehead wrote: 정말 고맙습니다. 답변해주셔서. 근데 한가지만 더 여쭙겠습니다. 테스트 해보라는 걸 ...
hugehead
•
2000.08.10 04:39
쿼리문을 올려주시지요.. 소스를 올리시던지.. 그냥 설명으로는 더이상 모르겠네요. Commit 나 Rollback...
목마름
2000.08.09 05:18
0
COMMENTS
/
0
LIKES
[긴급사항]Quick Report관련
김종석
•
2000.08.09 05:00
1
COMMENTS
/
0
LIKES
Key Violation 에러가 모죠?...
최석기
•
2000.08.09 06:16
김종석 wrote: > 파라독스 DB사용하는데요... > 일반 스트링그리드에서 입력한 사항을 DB로 옮기려고 하...
김태영
•
2000.08.09 04:55
2
COMMENTS
/
0
LIKES
비베의 sleep함수는 델파이이에서 어떻게 되나요?
최용일
•
2000.08.09 06:17
안녕하세요. 최용일입니다. 그거 API함수 아닌가요? 똑같이 있는데.. Sleep. 먼저 헬프에서 찾아보신뒤...
최석기
•
2000.08.09 06:14
김태영 wrote: > 비베의 sleep함수는 델파이이에서 어떻게 되나요? 고수님의 답변 부탁드립니다. 김태...
대구에서
2000.08.09 04:29
0
COMMENTS
/
0
LIKES
eidt컴포넌트에서 입력포멧양식
새내기
2000.08.09 04:28
0
COMMENTS
/
0
LIKES
DLL 작성
희찬
2000.08.09 04:21
0
COMMENTS
/
0
LIKES
동적인 mdb형성은 어떻게 하는지..?
하진일
2000/08/09 05:20
Views
348
Likes
0
Comments
1
Reports
0
Tag List
수정
삭제
목록으로
한델 로그인 하기
로그인 상태 유지
아직 회원이 아니세요? 가입하세요!
암호를 잊어버리셨나요?
> 음..bmp 파일에서 컬러값을 추출하려고 합니다.
>
> pixel이라는 메소드를 사용하는데요..
>
> 추출한 컬러값이 24비트 컬러값이 나오는데
>
> 그 그림이 원래 8비트(256컬러)인데도 불구하고 24비트 값이 나옵니다.
>
> 컴포넌트나 아니면 다른 방법으로 원 컬러값(8비트)으로
>
> 출력하는 방법없습니까?
>
음. 아마도 그림을 이미지 컴포넌트에다가 불러 놓고
color=Image1.Canvas.Pixel[x,y];
이런 식으로 색을 추출하셨다고 하는 것 같은데..... 글쎄요. 그런 식으로 과연 원
래의 컬러값을 읽어드릴 수 있을지 의문스럽군요. 사실 저도 그 쪽에 대해서 아는
게 별로 없는지라....
문제는 bmp 파일의 형식입니다. 만약 걔가 256컬러라면 일반 트루 컬러와는
형식이 다르거든요. bmp 파일 중 각 점들의 정보가 저장되어 있는 곳에 트루 컬러는
3바이트로 rgb값을 나타내는 것이 직접 들어가게 됩니다. 하지만 256컬러같은 경우
는 rgb quad에 있는 팔레트 인덱스 값이 그 곳에 들어갑니다. 그렇기 때문에 실제
색을 알려면 그 인덱스에 해당하는 팔레트의 rgb값들을 읽어와야 하죠. 좀 더 자세하
게 설명을 하죠. 지금의 경우는 256 컬러 bmp 파일의 경우를 말씀드리는 것입니다.
일단 헤더 부분은 건너 뛰고, 팔레트 있는 곳으로 가면 거기에는 아마 이렇게 되어
있을 것입니다. 정확한 명칭은 사용하지 않겠습니다(저도 잘 모르니까)
bmiColors[0].rgbRed=0;
bmiColors[0].rgbGreen=0;
bmiColors[0].rgbBlue=0;
bmiColors[1].rgbRed=0;
bmiColors[1].rgbGreen=0;
bmiColors[1].rgbBlue=51;
bmiColors[2].rgbRed=0;
bmiColors[2].rgbGreen=0;
bmiColors[2].rgbBlue=102;
:
:
bmiColors[254].rgbRed=255;
bmiColors[254].rgbGreen=255;
bmiColors[254].rgbBlue=204;
bmiColors[255].rgbRed=255;
bmiColors[255].rgbGreen=255;
bmiColors[255].rgbBlue=255;
그리고 실제 각 점들이 저장되는 곳은
01 0A FA DD 7C 9E ......
이렇게 되 있습니다. 그러면 첫 번째 점은 01이니까 저 위에 RGB값이 (0,0,51)인 색
을 나타내게 되죠. 두 번째 것은 10이니까 저 위에 긴 배열 중에 인덱스가 10인 곳
의 RGB 값을 나타내게 되죠. 저 뒤의 숫자들(0,0,0, 255, 51같은 것들)은 제가 임의
로 쓴 것이지, 사실 파일마다 다르게 되어 있습니다. 저게 바로 팔레트 엔트리라는
것이죠. 그러니 실제 저 값을 알려면 상당한 수고가 뒤따릅니다. 굳이 설명을 하자면
우선 BMP 파일의 헤더를 읽어서 BITMAPFILEHEADER와 BITMAPINFOHEADER부분을 건너 뛰
고 실제 점들이 저장되는 곳을 쭉 읽은 다음 다시 API를 써서 GetPaletteEntries로
각 엔트리에 어떤 RGB 값이 있는 지 파악을 한 다음 그것을 조금 전 읽은 값들에
대입하면 되겠죠. 그러니까 위의 얘로 설명을 하자면 일단 01 0A FA DD 7C
9E ......부분을 읽고, 그 다음 그 위에 긴 부분 있죠, 그 배열 쭉 나가는 데, 그
부분을 읽어서 01이니 하는 값들을 저 배열 요소에 집어 넣어서 rgb값을 뽑아내는
겁니다. 이렇게 하기, 장난이 아니겠죠! 하지만 사실 이 문제는 이렇게 하지 않고
도 할 수 있죠.
그리고 궁금한 것이 있는데, 님께서 어떻게 그 값이 24비트 컬러라고 생각하시는
지요....
color=Image1.Canvas.Pixel[x,y];
이렇게 했다면 그냥 저 팔레트 엔트리에 있는 값들이 제대로 뿌려졌을 테니까 제대
로 값이 나올 겁니다. 님께서 저 값이 00ffffff뭐 이런 식으로 살벌하게 나와서
아마 24비트가 아닌가 생각하신 것 같은데, 사실 256컬러도 rgb값으로 표현하기는
마찬가지니까 저렇게 나올 수밖에 없죠. 그러니까 이 값에서 r, g, b 값을 따로
떼어 내실려면
r=GetRValue(color);
g=GetGValue(color);
b=GetBValue(color);
하시면 됩니다. 아마 이러면 256컬러의 rgb값이 ,즉 팔레트 엔트리에 있는 값이
정확하게 나올 겁니다.