BMP 파일을 읽어오다가~~

dejavuh의 이미지

BMP 파일을 읽어서 파일의 정보를 보여주는 프로그램을 만들어 보려고 하고있씁니다.

일단 BITMAPFILEHEADER를 아래와 같이 MSDN에서 베껴다 놓았구요.

typedef struct tagBITMAPFILEHEADER {
short bfType;
int bfSize;
short bfReserved1;
short bfReserved2;
int bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

첫번째 질문 : 아무리 계산을 해보아도 데이터 크기가 14Byte인데 sizeof( ) 해보면 16 바이트가 나오네요. 뭐 이부분은 편법인지는 모르겠지만 다음 헤더를 읽을때 강제로 14바이트 뒤로 옵셋 이동시켜서 해결은 했습니다만.
두번째 질문 : 위의 데이터구조에서 첫번째 bfType은 제대로 읽어오는데, 그 다음것 부터는 2바이트씩 밀린 값을 읽어오네요. 예를 들어 bfSize의 값이 bfSzie 하위 두바이트 + bfReserved1의 데이터값을 읽어오는것 같습니다.

대략 4바이트 단위로 돌아가고 있는것 같은 느낌이 듭니다만, 깔끔하게 처리할 수 있는 방법이 있는지요 ???

감사합니다.

bugiii의 이미지

컴파일러 옵션이나 #pragma 를 찾아보세요.

정태영의 이미지

sizeof( BITMAPINFOHEADER) 만큼 읽어서 바로 구조체에 쓰지 마시고..
자료들 하나하나를 읽어서 써주면 됩니다..

...
..
.

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

vajna의 이미지

머나먼 땅으로 우리 동무가 이제 떠나간다네.
고향의 바람이 불어와 동무 뒤를 따르고
사랑스러운 도시가 푸른 이내 속에서 사라지네.
정든 집, 푸른 동산, 부드러운 눈길도...

charsyam의 이미지

dejavuh wrote:
BMP 파일을 읽어서 파일의 정보를 보여주는 프로그램을 만들어 보려고 하고있씁니다.

일단 BITMAPFILEHEADER를 아래와 같이 MSDN에서 베껴다 놓았구요.

typedef struct tagBITMAPFILEHEADER {
short bfType;
int bfSize;
short bfReserved1;
short bfReserved2;
int bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

첫번째 질문 : 아무리 계산을 해보아도 데이터 크기가 14Byte인데 sizeof( ) 해보면 16 바이트가 나오네요. 뭐 이부분은 편법인지는 모르겠지만 다음 헤더를 읽을때 강제로 14바이트 뒤로 옵셋 이동시켜서 해결은 했습니다만.
두번째 질문 : 위의 데이터구조에서 첫번째 bfType은 제대로 읽어오는데, 그 다음것 부터는 2바이트씩 밀린 값을 읽어오네요. 예를 들어 bfSize의 값이 bfSzie 하위 두바이트 + bfReserved1의 데이터값을 읽어오는것 같습니다.

대략 4바이트 단위로 돌아가고 있는것 같은 느낌이 듭니다만, 깔끔하게 처리할 수 있는 방법이 있는지요 ???

감사합니다.

bmp 파일을 보면 라인이 항상 4byte 단위로 정렬됩니다. 그러니깐 끝에
padding으로 4byte를 맞춰주므로 이 부분의 처리가 필요합니다. 고운 하루되세요.

=========================
CharSyam ^^ --- 고운 하루
=========================

germont의 이미지

첫번째 답변 :
packed attribute에 대해서 알아보시면 됩니다.
제가 일일히 설명하기는 그렇고 packed attribute에 관한 질답은
널렸습니다. ^^

두번째 답변 :
역시 packed attribute에 관한 것같습니다.

덧.
위의 질문에는 없지만
바로 charsyam님이 설명하신대로 한 width를 4byte단위로 file에 쓰게 됩니다.
무슨말인고 하니,
풀어서 설명하겠습니다.

BitCount가 4이고 (4bit bitmap)
width가 17 이라고 치면

1 height당 4 * 17 = 68 bit -> 9byte를 쓰게 되겠지요.
하지만 1 height당 9byte가 쓰이는게 아니라 12byte, 즉 DWORD단위대로 쓰이게 됩니다.

그러므로 68bit를 읽은다음, 나머지 부분에 대한 처리를 해주어야 하지요.

도움이 되었기를 바랍니다.

Love actually is all around

charsyam의 이미지

germont wrote:
첫번째 답변 :
packed attribute에 대해서 알아보시면 됩니다.
제가 일일히 설명하기는 그렇고 packed attribute에 관한 질답은
널렸습니다. ^^

두번째 답변 :
역시 packed attribute에 관한 것같습니다.

덧.
위의 질문에는 없지만
바로 charsyam님이 설명하신대로 한 width를 4byte단위로 file에 쓰게 됩니다.
무슨말인고 하니,
풀어서 설명하겠습니다.

BitCount가 4이고 (4bit bitmap)
width가 17 이라고 치면

1 height당 4 * 17 = 68 bit -> 9byte를 쓰게 되겠지요.
하지만 1 height당 9byte가 쓰이는게 아니라 12byte, 즉 DWORD단위대로 쓰이게 됩니다.

그러므로 68bit를 읽은다음, 나머지 부분에 대한 처리를 해주어야 하지요.

도움이 되었기를 바랍니다.

^^, germont 님이 제대로 설명하셨네요 ^^ 전, memory align 부분은 딴 분들이 설명하셔서 뒤에 문제될 부분만 적었는데 ^^ germont 님이 다 설명해 버리시네요 고운 하루

=========================
CharSyam ^^ --- 고운 하루
=========================

dejavuh의 이미지

흠흠~ 항상 여기에 오면 쓸만한 답변을 얻어내는 군요.. 아니 쓸만한 답을 주시는 군요 ^^ 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.