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
[5543] Re:Re:[질문] Canvas에 8bit의 Gray-scale로 그림을 그리고 싶습니다.
최혜원.시리 [sirius] 3068 읽음    2001-02-19 16:15
ghost 님이 쓰신 글 :
: 서준혁 님이 쓰신 글 :
: : 안녕하세요.
: : 지난번 임프님의 Q&A 게시판에서 도움을 많이 받았었습니다.
: : 이번에도 알고 싶은 것이 있어 글을 남깁니다.
: : Canvas에 8bit의 Gray-scale로 그림을 그리고 싶습니다.
: : 물론 RGB(R, G, B)를 사용하여 Gray-scale을 구현할 수도 있겠지만,
: : 혹시라도 다른 방법이 없을까 해서요.
: : RGB를 이용하지 않고 구현할 수 있는 방법이 있으면 좀 가르쳐 주십시오.
: : 그럼 고수님들의 친절한 가르침을 기다리겠습니다.
:
: 바로 앞의 분 답변은 저로서는 잘 이해가 가지 않네요.
: Grayscale이면 R, G, B 값이 같아야 하는데 어떻게 다른 비율로 혼합을 하는 것인지..
:
: 암튼, 저도 비트맵에 대해서는 잘 모르지만 다른 사람이 짜놓은 거를 이용해서
: 잘 쓰고 있기 때문에 그것을 알려드리죠. 바로 팔레트를 변경하는 것입니다.
: 예제 소스는 256 스텝 Grayscale 팔레트를 가지는 비트맵을 만드는 것이구요..
:
: 실제로 그림을 그리는 루틴에서는 (아시겠지만) 비트맵에 Scanline 멤버나
: 픽셀 등을 이용해 그리신 다음에 Canvas->Draw()를 이용하면 되겠지요.
:
:
: void __fastcall TForm1::FormCreate(TObject *Sender)
: {
:
:     m_hGrayPal = Create256GrayPalette();
:
:     m_pBitmap1 = new Graphics::TBitmap();
:     m_pBitmap1->Width = 256;
:     m_pBitmap1->Height = 256;
:     m_pBitmap1->PixelFormat = pf8bit;
:     m_pBitmap1->HandleType = bmDIB;
:     m_pBitmap1->Palette = m_hGrayPal;
: }
:
: HPALETTE __fastcall TForm1::Create256GrayPalette()
: {
:    // create palette
:    LPLOGPALETTE        lpPal;          // pointer to a logical palette
:    HANDLE              hLogPal;        // handle to a logical palette
:    HPALETTE            hPal = NULL;    // handle to a palette
:    // create palette
:    // allocate memory block for logical palette
:    hLogPal = GlobalAlloc(GHND, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * 256);
:    // if not enough memory, clean up and return NULL
:    if (!hLogPal)
:        return NULL;
:    // lock memory block and get pointer to it
:    lpPal = (LPLOGPALETTE)GlobalLock(hLogPal);
:    // set version and number of palette entries
:    lpPal->palVersion = 0x300;
:    lpPal->palNumEntries = 256;
:    // store RGB triples (if Win 3.0 DIB) or RGB quads (if OS/2 DIB)
:    // into palette
:    for (int i = 0; i < 256; i++){
:       lpPal->palPalEntry[i].peRed = (char)i;
:       lpPal->palPalEntry[i].peGreen = (char)i;
:       lpPal->palPalEntry[i].peBlue = (char)i;
:       lpPal->palPalEntry[i].peFlags = 0;
:    }
:    hPal = CreatePalette(lpPal);
:    // if error getting handle to palette, clean up and return NULL
:    if (!hPal){
:       GlobalUnlock(hLogPal);
:       GlobalFree(hLogPal);
:       return NULL;
:    }
:    // clean up
:    GlobalUnlock(hLogPal);
:    GlobalFree(hLogPal);
:
:    return hPal;
: }
:



안녕하세요..
저도 정확히는 잘 모르지만..
ghost 님의 글중에 조금 참고해 드릴려고 글 남깁니다.
Grayscale 이 RGB 값이 같아야 하는것은 맞습니다.
하지만.. 위위글의 답변은 같아야하는 그 값을 무엇으로 해야하나 하는 방법이랍니다.
즉 어떤 칼라이미지를 GrayScale로 바꾸려고 할때 palette 작업없이 바꾸는 방법입니다.
Value = 0.299R + 0.587G + 0.114B 는 그냥 구해진 식이 아니라, 눈의 밝기에 대한 Sensitivity에 맞게 계산된 결과입니다.

쉽게 한가지 예를 드리자면 PixelFormat이 pf24bit 라고 가정하자면
R = 15
G = 78
B = 56 이라고 하자면

그 값의 Gray 값은 = 56  ( 계산값이 틀릴수도 있습니다. *^^*)
따라서 다시
R = 56
G = 56
B = 56 이렇게 바꾸는 것입니다.


+ -

관련 글 리스트
5516 [질문] Canvas에 8bit의 Gray-scale로 그림을 그리고 싶습니다. 서준혁 2619 2001/02/16
5539     Re:[질문] Canvas에 8bit의 Gray-scale로 그림을 그리고 싶습니다. ghost 2957 2001/02/19
5574             Re:Re:Re:[질문] Canvas에 8bit의 Gray-scale로 그림을 그리고 싶습니다. ghost 2695 2001/02/20
5543         Re:Re:[질문] Canvas에 8bit의 Gray-scale로 그림을 그리고 싶습니다. 최혜원.시리 3068 2001/02/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.