Q&A

  • bmp 파일에서 컬러값 추출할때..
음..bmp 파일에서 컬러값을 추출하려고 합니다.



pixel이라는 메소드를 사용하는데요..



추출한 컬러값이 24비트 컬러값이 나오는데



그 그림이 원래 8비트(256컬러)인데도 불구하고 24비트 값이 나옵니다.



컴포넌트나 아니면 다른 방법으로 원 컬러값(8비트)으로



출력하는 방법없습니까?



1  COMMENTS
  • Profile
    없음 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값이 ,즉 팔레트 엔트리에 있는 값이



    정확하게 나올 겁니다.